gpt4 book ai didi

windows - 等待 AfxBeginThread/CWinThread 消息泵激活?

转载 作者:可可西里 更新时间:2023-11-01 11:14:24 28 4
gpt4 key购买 nike

我正在调用 AfxBeginThread 并使用 CWinThread 在我的 MFC 应用程序中启动一个 UI 线程。

我注意到,如果我的主线程在 CWinThread::InitInstance() 函数返回之前尝试将 PostThreadMessage() 发送到我的新线程,那么 PostThreadMessage() 将返回错误:无效的线程句柄。

我的猜测是新线程上的消息泵直到 InitInstance 返回后才设置。我看到的 AfxBeginThread 示例代码和我读过的文档并没有很好地解释这种行为,也没有显示等待线程初始化的模式。

在 InitInstance 返回并且线程的消息泵准备好接收消息之前阻塞主线程的最佳方法是什么?

最佳答案

您真的不需要等待消息泵。您只需要等待创建消息队列。这样,消息泵将在最终启动时接收所有发布的消息。这是我认为您可以做到的方法(省略了错误检查):

CEvent myEvent;

CWinThread * myThread = AfxBeginThread( ..., CREATE_SUSPENDED );

QueueUserAPC( MyCallback, *myThread, reintepret_cast<ULONG_PTR>( &myEvent ) );

myThread->Resume();

WaitForSingleObject( myEvent, INFINITE );

在 Windows 中,一旦线程启动,它就会在调用其入口点之前运行所有排队的用户 APC。因此,这使您可以在 MFC 框架接管之前在新线程上潜入一些代码。您的 APC 回调看起来像这样:

VOID CALLBACK MyCallback( ULONG_PTR param )
{
// Call peek message to force the creation of the thread's message queue.
MSG dummy;

PeekMessage( &dummy, NULL, 0, 0, PM_NOREMOVE );

CEvent * pEvent = reinterpret_cast<CEvent *>( param );

pEvent->SetEvent();
}

关于windows - 等待 AfxBeginThread/CWinThread 消息泵激活?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6446877/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com