- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在调用 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/
AfxBeginThread 做这件事时有多少开销? 我有一个令人尴尬的并行项目,我想用 AfxBeginThread 启动 4-15 个线程的批处理,等待每个线程自然完成,比较结果,然后重复无数次。
我尝试将结构作为参数传递。 全局结构: struct ThreadParams { HWND window; LIB::ServiceContainer* mrt; }; 在主线程中: T
我正在尝试使用 MFC 创建一个工作线程,所以这里是代码: struct ThreadParam { HWND mDlg; // Note: A handle. }; UINT Test
使用 Afxbeginthread 有什么缺点吗?我们什么时候应该使用 AfxBeginThread,什么时候应该使用 CreateThread API。 最佳答案 对于 MFC 程序,使用 AfxB
我在 MFC 中使用::AfxBeginThread 时遇到问题。 我试着创建一个线程,这是我的代码。 void CMyoControllerView::OnCbnSelchangeComboFist
我可以通过 PostMessage 和 AfxBeginThread(异步调用)实现相同的功能那么PostMessage和AfxBeginThread的区别在哪里呢? 最佳答案 AfxBeginThr
我正在使用 AfxBeginThread 启动一个线程。这将返回一个指向新的 CWinThread 对象的指针。 MSDN 声明此指针为 NULL,如果线程创建失败,它将释放所有内容。但是,一旦线程在
我正在调用 AfxBeginThread 并使用 CWinThread 在我的 MFC 应用程序中启动一个 UI 线程。 我注意到,如果我的主线程在 CWinThread::InitInstance(
看这段代码: // Function that start the thread ... data = (PWTools::Data*)malloc(sizeof(PWTools::Data)); d
我有一个 MFC 应用程序,我想在其中加入多线程。最初我正在考虑使用 Boost.Thread,因为使用 boost 开发通常很容易。但是,我想知道是否存在任何问题,我是否应该使用 AfxBeginT
当您不使用 boost::thread 而是通过 AfxBeginThread 使用 MFC 线程功能时,您能否使用 boost::mutex 库来保护代码的关键部分?如果是这样,这样做有什么问题吗?
我是一名优秀的程序员,十分优秀!