2

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

然后我想做类似的事情:

(伪代码)

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 的线程不同。

这似乎是一个必须多次解决的简单问题?必须处理线程问题只是为了知道何时向 IMO 发出事件信号,这有点矫枉过正。

编辑:

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

4

2 回答 2

0

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

主要思想是创建一个虚拟窗口

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

并通过SendMessage

于 2013-06-18T11:08:06.283 回答
0

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

于 2013-06-18T12:04:48.750 回答