::WaitForSingleObject (m_hThread, 0) 和 ::WaitForSingleObject (m_hThread, 1) 的区别

有趣之极 2008-11-25 03:33:03

UINT ShowTagThreadFunc (LPVOID pParam)
{
ShowTagThreadData* pData = reinterpret_cast<ShowTagThreadData*>(pParam);
CProgressCtrl* pPC = (CProgressCtrl*)CWnd::FromHandle(pData->hwndProgressCtrl);
pPC->SetRange32(0, 0xFFFF);
pPC->SetPos(0);

int iLo, iHi;
pPC->GetRange(iLo, iHi);

for (int i=iLo; i<iHi; i++)
{
if (::WaitForSingleObject(pData->pStopEvent->m_hObject, 1) == WAIT_OBJECT_0)
{
break;
}

pPC->SetPos(i+1);
}

delete pData;
return 0;
}


void CThreadDlg::OnBnClickedOk()
{
m_event.ResetEvent();
ShowTagThreadData* pData = new ShowTagThreadData;
pData->pStopEvent = &m_event;
pData->hwndProgressCtrl = m_pc.m_hWnd;

DWORD dwThreadId;
m_hThread = chBEGINTHREADEX(NULL, 0, ShowTagThreadFunc, (PVOID) (DWORD_PTR) pData,
0, &dwThreadId);

ASSERT(m_hThread != NULL);
}

void CThreadDlg::OnBnClickedButton1()
{
m_event.SetEvent();

::WaitForSingleObject(m_hThread, INFINITE);
::CloseHandle(m_hThread);
m_hThread = NULL;
}
...全文
281 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
有趣之极 2008-11-25
  • 打赏
  • 举报
回复
贴代码怎么这么难看,测试一下


bool CMultiEditor::IsDataTypeEditable()
{
return false;
}
有趣之极 2008-11-25
  • 打赏
  • 举报
回复
改成这样就 OK 了
void CThreadDlg::OnBnClickedButton1()
{
m_event.SetEvent();

//::WaitForSingleObject(m_hThread, INFINITE);
while (TRUE)
{
MSG msg ;
if (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}

if (::WaitForSingleObject(m_hThread, 0) == WAIT_OBJECT_0)
{
break;
}
}

::CloseHandle(m_hThread);
m_hThread = NULL;
}
有趣之极 2008-11-25
  • 打赏
  • 举报
回复
谢谢,问题出在pPC->SetPos(i+1);这是通过消息实现的,而在void CThreadDlg::OnBnClickedButton1()中的::WaitForSingleObject(m_hThread, INFINITE); 会阻塞消息循环,造成死锁。

这种处理机制有问题,需要其他变通方法。
李马 2008-11-25
  • 打赏
  • 举报
回复
当 dwMilliseconds 为 0 的时候,WaitForSingleObject 只是简单检测一下目标对象的状态(是否有信号)并立即返回。
因此这里的返回值应该是 WAIT_TIMEOUT ,而这并不构成跳出循环的条件。
有趣之极 2008-11-25
  • 打赏
  • 举报
回复
这是一个示例工程,对话框中有一个进度条,在线程中展示进度
有趣之极 2008-11-25
  • 打赏
  • 举报
回复
如上所示代码,if (::WaitForSingleObject(pData->pStopEvent->m_hObject, 1) == WAIT_OBJECT_0) 改成 0 毫秒的话,点击按钮就会进入死锁状态,1 的话,可以break,想不明白其中道理,期待大侠解惑。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧