由于句柄无效,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 返回等待失败的主要内容,如果未能解决你的问题,请参考以下文章

错误6句柄在Windows上写入文件无效[关闭]

SQL Server 2008 R2执行存储过程sp_MailItemResultSets引起大量PREEMPTIVE_OS_WAITFORSINGLEOBJEC等待

securecrtYmodem句柄无效

win10刻盘时出现无效的文件句柄如何修复?

Windows 内核开发设备句柄无效的句柄值

处理无效的文件句柄(可能还有其他无效对象)