C++ 等待句柄/事件异步或在同一线程内回调

C++ 等待句柄/事件异步或在同一线程内回调,c++,multithreading,winapi,C++,Multithreading,Winapi,我使用CreateEvent创建了一个全局事件,并使用OpenEvent在另一个应用程序中获取该事件的句柄 然后我想做一些类似的事情: (比苏多代码) 其中,my_call_back在调用register_event_change_notification的同一线程上执行。然而,我的问题是,我找不到任何允许这样做的API。您似乎只有以下选项: 创建一个使用WaitForSingleObject的线程,然后调用my_call_,并在所有内容周围放置关键部分 创建一个使用WaitForSingleO

我使用CreateEvent创建了一个全局事件,并使用OpenEvent在另一个应用程序中获取该事件的句柄

然后我想做一些类似的事情:

(比苏多代码)

其中,my_call_back在调用register_event_change_notification的同一线程上执行。然而,我的问题是,我找不到任何允许这样做的API。您似乎只有以下选项:

  • 创建一个使用WaitForSingleObject的线程,然后调用my_call_,并在所有内容周围放置关键部分

  • 创建一个使用WaitForSingleObject的线程,并用消息循环阻塞主线程,然后在WaitForSingleObject时发布事件,以使my_call_在与消息循环相同的线程中执行,该线程可能与调用register_event_change_通知的线程不同

  • 这似乎是一个必须解决多次的简单问题?仅仅为了知道事件何时被通知,就必须处理线程问题,这样做太过分了

    编辑:

    最后,我选择了使用QueueUserApc——但这意味着您的消息put必须使用*exAPI将线程置于可警报状态。另一个问题是,您必须跟踪您的优秀APC,而不是在对象服务完所有APC之前销毁它们。否则,将有一个APC排队等待一个已销毁/已删除的对象。

    这里--这是我对一个问题的决定。抱歉,非英语评论(俄语)

    其主要思想是使用

    m_wnd = CreateWindowA( "STATIC", "", 0,
            CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
            HWND_MESSAGE, NULL, NULL, NULL);
    

    要通过发送消息给它,您对选项的分析是正确的。对于使用消息的选项2,有两个选项可以将通知导向所需线程。(a) 对于非GUI线程目标,请使用PostThreadMessage。(b) 对于GUI线程目标,您可以向目标HWND发送PostMessage或SendMessage。消息由创建HWND的线程接收

    m_wnd = CreateWindowA( "STATIC", "", 0,
            CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
            HWND_MESSAGE, NULL, NULL, NULL);