// TODO: Add your control notification handler code here
UpdateData(TRUE);
Info.nMilliSecond=m_nMilliSecond;
Info.pctrlProgress=&m_ctrlProgress;
hThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadFunc,
&Info,
0,
&ThreadID);
/*
GetDlgItem(IDC_START)->EnableWindow(FALSE);
WaitForSingleObject(hThread,INFINITE);
GetDlgItem(IDC_START)->EnableWindow(TRUE);
*/
}
在函数 BOOL CMultiThread3Dlg::OnInitDialog()中添加语句: {
……
// TODO: Add extra initialization here
m_ctrlProgress.SetRange(0,99);
m_nMilliSecond=10;
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
}
添加线程处理函数:UINT ThreadFunc(LPVOID lpParam) {
threadInfo* pInfo=(threadInfo*)lpParam;
for(int i=0;i<100;i++)
{
int nTemp=pInfo->nMilliSecond;
pInfo->pctrlProgress->SetPos(i);
Sleep(nTemp);
}
return 0;
}
顺便补充一点,如果你在 void CMultiThread3Dlg::OnStart() 函数中添加/* */语句,编译
运行你就会发现进度条不进行刷新,主线程也停止了反应。什么原因呢?这是因为
WaitForSingleObject 函数等 待子线程 (ThreadFunc )结束时 ,导致了 线程死锁 。因为
WaitForSingleObject 函 数 会 将 主 线 程 挂 起 ( 任 何 消 息 都 得 不 到 处 理 ) , 而 子 线 程
ThreadFunc 正在设置进度条,一直在等待主线程将刷新消息处理完毕返回才会检测通知事
件。这样两个线程都在互相等待,死锁发生了,编程时应注意避 免。
例程 4 MultiThread4
该例程测试在 Windows 下最多可创建线程的数目。