1 要分析哪些任务部分是可以同时执行,相互不受影响的。对最耗时的部分进行多线程运算。
2 对共同使用的变量要加锁。
3 尽量不要在新线程里面进行UI界面的操作。
HANDLE m_hTestThread[TEST_DEV_THREAD_NUM];
CDevScanToolDlg::CDevScanToolDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDevScanToolDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
for (int i=0;i<TEST_DEV_THREAD_NUM;++i)
{
m_hTestThread[i] = NULL;
}
m_bStopWorkerThread = FALSE;
m_lFinish=0;
m_lProgressPos=0;
}
void CDevScanToolDlg::OnBnClickedButtonStart()
{
......
for (int i=0;i<TEST_DEV_THREAD_NUM;++i)
{
m_hTestThread[i] = (HANDLE)_beginthreadex(NULL,0,FuncTestDevThread,this,0,NULL);
}
......
}
unsigned int CALLBACK FuncTestDevThread( void* pParam )
{
CDevScanToolDlg* pDlg = (CDevScanToolDlg*)pParam;
if (NULL != pDlg)
{
pDlg->TestDeviceInfoThread();
}
return 0;
}
void CDevScanToolDlg::TestDeviceInfoThread()
{
while (!m_bStopWorkerThread)
{
.......
}
}
void CDevScanToolDlg::OnCancel()
{
m_bStopWorkerThread = TRUE;
for (int i=0;i<TEST_DEV_THREAD_NUM;++i)
{
if (m_hTestThread[i])
{
WaitForSingleObject(m_hTestThread[i],INFINITE);
CloseHandle(m_hTestThread[i]);
m_hTestThread[i] = NULL;
}
}
if (m_hEvent)
{
CloseHandle(m_hEvent);
m_hEvent = NULL;
}
CDialog::OnCancel();
}