⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 workerthreadsview.cpp

📁 Introduces synchronization concepts and practices in multithreaded applications
💻 CPP
字号:
// WorkerThreadsView.cpp : implementation of the CWorkerThreadsView class
//

#include "stdafx.h"
#include "WorkerThreads.h"

#include "WorkerThreadsDoc.h"
#include "WorkerThreadsView.h"
#include ".\workerthreadsview.h"
#include "Threads.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// manual-reset event
CEvent g_eventEnd(FALSE, TRUE);


// CWorkerThreadsView

IMPLEMENT_DYNCREATE(CWorkerThreadsView, CView)

BEGIN_MESSAGE_MAP(CWorkerThreadsView, CView)
	ON_WM_LBUTTONDOWN()
	ON_WM_DESTROY()
END_MESSAGE_MAP()

// CWorkerThreadsView construction/destruction

CWorkerThreadsView::CWorkerThreadsView()
{
	// TODO: add construction code here

}

CWorkerThreadsView::~CWorkerThreadsView()
{
}

BOOL CWorkerThreadsView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

// CWorkerThreadsView drawing

void CWorkerThreadsView::OnDraw(CDC* /*pDC*/)
{
	CWorkerThreadsDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: add draw code for native data here
}


// CWorkerThreadsView diagnostics

#ifdef _DEBUG
void CWorkerThreadsView::AssertValid() const
{
	CView::AssertValid();
}

void CWorkerThreadsView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CWorkerThreadsDoc* CWorkerThreadsView::GetDocument() const // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CWorkerThreadsDoc)));
	return (CWorkerThreadsDoc*)m_pDocument;
}
#endif //_DEBUG


// CWorkerThreadsView message handlers

void CWorkerThreadsView::OnLButtonDown(UINT nFlags, CPoint point)
{
    THREADINFO *pInfo = new THREADINFO;
    pInfo->hWnd = GetSafeHwnd();
    pInfo->point = point;

    CWinThread *pThread = AfxBeginThread(ThreadDraw, (PVOID) pInfo, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
    pThread->m_bAutoDelete = FALSE;
    pThread->ResumeThread();
    m_ThreadArray.Add(pThread);
}

void CWorkerThreadsView::OnDestroy()
{
	g_eventEnd.SetEvent();

/*	// first way
	for (int j = 0; j < m_ThreadArray.GetSize(); j ++)
	{
		::WaitForSingleObject(m_ThreadArray[j]->m_hThread, INFINITE);
		delete m_ThreadArray[j];
	}
*/

	//second way
	int nSize = m_ThreadArray.GetSize();
	HANDLE *p = new HANDLE[nSize];

	for (int j = 0; j < nSize; j ++)
	{
		p[j] = m_ThreadArray[j]->m_hThread;
	}

	::WaitForMultipleObjects(nSize, p, TRUE, INFINITE);

	for (int j = 0; j < nSize; j ++)
	{
		delete m_ThreadArray[j];
	}
	delete [] p;


	TRACE("- CWorkerThreadsView::OnDestroy: finished!\n");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -