我正在调用AfxBeginThread并使用CWinThread在我的MFC应用程序中启动UI线程 .
我注意到如果我的主线程在CWinThread :: InitInstance()函数返回之前尝试PostThreadMessage()到我的新线程,那么PostThreadMessage()将返回错误:无效的线程句柄 .
我的猜测是,在InitInstance返回之后,新线程上的消息泵才会被设置 . 我在AfxBeginThread上看到的示例代码和我读过的文档并没有很好地解释这种行为,或者显示一个等待线程初始化的模式 .
阻止我的主线程直到InitInstance返回并且线程的消息泵准备好接收消息的最佳方法是什么?
2 回答
你真的不需要等待消息泵 . 您只需要等待创建消息队列 . 这样,消息泵将在最终启动时接收所有发布的消息 . 这是我认为你可以做到的一种方式(省略错误检查):
在Windows中,一旦线程启动,它就会在调用其入口点之前运行任何排队的用户APC . 因此,这可以让您在MFC框架接管之前在新线程上隐藏一些代码 . 你的APC回调看起来像这样:
彼得的答案是好的,因为他认识到"you just need to wait for the message queue to be created" . 这一启示导致以下链接出现在相关答案中:WaitForSingleObject returns wait failed due to invalid handle,这表明了一种更简单的方式来做彼得所建议的 .