我有一个使用CreateEvent创建的全局事件,我使用OpenEvent在另一个应用程序中获取此事件的句柄。
然后我希望做类似的事情:
(pesudo代码)
register_event_change_notification(my_call_back);
void my_call_back()
{
// do work
}
my_call_back在调用register_event_change_notification的同一线程上执行。但是我的问题是我找不到任何允许这样做的API。您似乎只有以下选项:
创建一个使用WaitForSingleObject的线程,然后只调用my_call_back并将关键部分放在所有内容中。
创建一个使用WaitForSingleObject并使用消息循环阻止主线程的线程,然后在WaitForSingleObject发布事件时发布事件,以便在与消息循环相同的线程中执行my_call_back - 这可能与调用register_event_change_notification的线程不同
这似乎是一个必须多次解决的简单问题?为了知道事件何时被IMO发出信号,它必须处理线程问题。
编辑:
最后我使用了QueueUserApc - 但这意味着你的消息必须使用* Ex API将线程置于警报状态。另一个问题是你必须跟踪你未完成的APC,而不是在他们为所有APC提供服务之前销毁它们。否则,您将获得一个排队到被破坏/删除对象的APC。
答案 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的线程接收。