例程1
struct threadinfo
{
UINT nMillisecod;
CProgressCtrl* pctrlProgress;
};
UINT ThreadFunc(LPVOID lpParam)
{
threadinfo*pInfo = (threadinfo*)lpParam;
for (int i = 0;i < 100;i++)
{
int nTemp = pInfo->nMillisecod;
pInfo->pctrlProgress->SetPos(i);
Sleep(nTemp);
}
return 0;
}
threadinfo Info;
void Cmultithread3Dlg::OnBnClickedStart()
{
UpdateData(TRUE);
Info.nMillisecod = m_mMillisecond;
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);
}
在這里面如果不把WaitForSingleObject(hThread,INFINITE);注釋掉,就會死鎖。但是在另一個蜂鳴器的例子里卻不會發生死鎖。我感覺這兩個例子并沒有不一樣,為什么進度條控制元件這個會死鎖呢?
附蜂鳴器例程
void ThreadFunc(int integer)
{
int i;
for(i=0;i<integer;i++)
{
Beep(500,500);
Sleep(1000);
}
}
void CMultiThread2Dlg::OnStart()
{
UpdateData(TRUE);
int integer=m_nCount;
hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,(VOID*)integer,0,&ThreadID);
GetDlgItem(IDC_START)->EnableWindow(FALSE);
WaitForSingleObject(hThread,INFINITE);
GetDlgItem(IDC_START)->EnableWindow(TRUE);
}
uj5u.com熱心網友回復:
你這里wait會租塞UI執行緒。UI執行緒是不能有等待的。會造成界面假死uj5u.com熱心網友回復:
死鎖的原因是兩個執行緒互相等待, 包括隱式的等待前面的例子 pctrlProgress->SetPos(i);
SetPos 是用SendMessage, 這個包含了隱式的等待, 兩個互相等是必掛的
uj5u.com熱心網友回復:
好的,明白了 謝謝解答!轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/122962.html
標籤:進程/線程/DLL
上一篇:USB HID Descriptor(usb 報告描述符)
下一篇:請教一下API驅動串口設備通信,使用readfile(),writefile(),程式是怎么處理設備資料的讀寫的??
