这么安全的代码,还说会死锁。 无语
- C/C++ code
在以下代码中,线程Thread退出时,可能会要UI线程互锁void CTagScanPCDlg::StopRead(){ if (m_hEvent != NULL) //线程结束等待事件 { SetEvent(m_hEvent); } if (m_hThreadRead != NULL) { WaitForSingleObject(m_hThreadRead,INFINITE); //等待线程结束 DWORD dwExitCode = 0; m_hThreadRead = NULL; } m_hEvent = NULL;}DWORD WINAPI CTagScanPCDlg::ReadThread(LPVOID lpParam){ while (WaitForSingleObject(pDlg->m_hEvent,0) == WAIT_TIMEOUT){ …… pDlg->SetDlgItemText(IDC_TAGGROUP,(LPCTSTR)szTextTitle); //操作UI元素 ……}……}这么安全的代码,还说会死锁。 无语
[解决办法]
要不就是他没把东西帖全,要不就是他理解错了。
如果那人的代码里,创建event时,bManualReset传得是true,那么Delay代码没什么用
while(WaitForSingleObject(hEvent,0) == WAIT_TIMEOUT) 这个不会是timeout,退出循环,退出delay函数了。
如果bManualReset是false,那么delay里的wait就有可能把之前自己的setEvent给吃了,然后退出,继续运行到之后的wait。
而ReadThread里的 while (WaitForSingleObject(pDlg->m_hEvent,0) == WAIT_TIMEOUT) 就会是timeout,Event已经被那delay里的wait重置了。
然后进入循环
pDlg->SetDlgItemText(IDC_TAGGROUP,(LPCTSTR)szTextTitle);
现在可以运行这句操作UI了(如果这个就是他指的操作UI的话),但这个才叫死循环(如果没贴出的代码里没有其他退出while的方法)。