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

Wait for handle/event async or call back within the same thread

本文关键字:一线 线程 回调 句柄 事件 异步 等待      更新时间:2023-10-16

我用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的线程。

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

编辑:

最后我去使用QueueUserApc -但这意味着你的消息必须使用*Ex API把线程在一个可报警的状态。另一个问题是,你必须跟踪你的优秀APC,而不是破坏对象之前,他们已经服务了所有的APC。否则你会得到一个APC排队到一个销毁/删除的对象。

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

这里- http://pastebin.com/ucpDdYGZ -是我的一个问题的决定。对不起,非英语评论(他们是俄语)。

主要思想是用 创建一个虚拟窗口。
m_wnd = CreateWindowA( "STATIC", "", 0,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        HWND_MESSAGE, NULL, NULL, NULL);
并通过SendMessage
发送消息