由于句柄无效,WaitForSingleObject 返回等待失败
Posted
技术标签:
【中文标题】由于句柄无效,WaitForSingleObject 返回等待失败【英文标题】:WaitForSingleObject returns wait failed due to invalid handle 【发布时间】:2011-02-14 04:39:08 【问题描述】:我正在尝试使用CEvent
让我的线程等待,直到按照MSDN's advice 准备好消息队列,这样我的PostThreadMessage
函数才能正常工作。
BOOL MFC_Thread::InitInstance()
BOOL worked=CWinThread::InitInstance();
MSG msg;
BOOL result=PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
fingerveinControllerThreadReady->SetEvent();//Breakpoint 1
return TRUE;
void init()
controllerThreadReady=new CEvent(FALSE, FALSE);
CWinThread* thread=AfxBeginThread(RUNTIME_CLASS(MFC_Thread));
controllerThread=thread->m_nThreadID;
WaitForSingleObject(controllerThreadReady, INFINITE);
DoSomething();//Breakpoint 2
不幸的是,WaitForSingleObject
似乎没有发挥作用。有时断点 1 被首先命中,有时断点 2。当断点 2 被首先命中时,我收到WAIT_FAILED
,原因为ERROR_INVALID_HANDLE
。为什么会这样?
【问题讨论】:
【参考方案1】:这可能是因为您传递的是 CEvent
对象而不是其句柄。
试试这个:
WaitForSingleObject(controllerThreadReady.m_hObject, INFINITE);
【讨论】:
我用的是operator HANDLE:这不是得到运营商的句柄吗? 好的,我尝试了您的建议,现在似乎可以了。那你知道运营商是干什么用的吗? 您没有使用运算符 HANDLE:您使用 CEvent* 作为第一个参数调用 WaitForSingleObject。由于 HANDLE 是 void* 的 typedef,因此可以接受,并且调用试图将 CEvent* 解释为句柄。要使用操作符,需要 WaitForSingleObject((HANDLE)*controllerThreadReady,...)以上是关于由于句柄无效,WaitForSingleObject 返回等待失败的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 2008 R2执行存储过程sp_MailItemResultSets引起大量PREEMPTIVE_OS_WAITFORSINGLEOBJEC等待