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

时间:2013-06-18 10:54:10

标签: c++ multithreading winapi

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

然后我希望做类似的事情:

(pesudo代码)

register_event_change_notification(my_call_back);

void my_call_back()
{
  // do work
}

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

  1. 创建一个使用WaitForSingleObject的线程,然后只调用my_call_back并将关键部分放在所有内容中。

  2. 创建一个使用WaitForSingleObject并使用消息循环阻止主线程的线程,然后在WaitForSingleObject发布事件时发布事件,以便在与消息循环相同的线程中执行my_call_back - 这可能与调用register_event_change_notification的线程不同

  3. 这似乎是一个必须多次解决的简单问题?为了知道事件何时被IMO发出信号,它必须处理线程问题。

    编辑:

    最后我使用了QueueUserApc - 但这意味着你的消息必须使用* Ex API将线程置于警报状态。另一个问题是你必须跟踪你未完成的APC,而不是在他们为所有APC提供服务之前销毁它们。否则,您将获得一个排队到被破坏/删除对象的APC。

2 个答案:

答案 0 :(得分:0)

这里 - http://pastebin.com/ucpDdYGZ - 是我对问题的决定。很抱歉非英语评论(俄语)。

主要思想是使用

创建一个虚拟窗口
m_wnd = CreateWindowA( "STATIC", "", 0,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        HWND_MESSAGE, NULL, NULL, NULL);

并通过SendMessage

向其发送消息

答案 1 :(得分:0)

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