我正在将应用程序移植到 Mac OS X。
我也需要在 Mac OS X 上执行以下任务。线程A需要向另一个线程B的消息队列投递消息。这些消息也涉及一些自定义消息。 在像 EXIT_LOOP 这样的特定消息上,线程 B 退出消息循环。
我已经使用 CFRunLoop 为线程 B 启动了消息循环。
现在我找不到线程 A 如何向线程 B 发送消息。
在 Windows 中,这是可能的 PostThreadMessage。可能没有为此直接移植到 Mac OS X,但必须有一种方法可以在 Mac OS X 上做到这一点。
请注意,线程 B 不知道线程 A,但线程 A 知道线程 B。
Windows 代码:
MessageLoop () {
MSG message;
BOOL ret;
while(ret = GetMessage(&message, NULL, 0, 0) != 0) {
if(ret == -1)
break;
if(UseMessage(message) = EXIT)
break;
}
}
int UseMessage (MSG Message)
{
switch(Message) {
//Process various messages.
case I_AM_COMPLETE:
return EXIT;
}
}
//Thread A:
MessageLoop ();
//Cleanup
//Thread B:
PostThreadMessage(threadidofA, I_AM_COMPLETE, 0, 0);
我相信这段代码可能会更清晰。我想要 Mac OS X 上的等效功能。
最佳答案
作为一般性建议,您应该对移植工作采取不同的策略。不要试图将 Win32 编码策略“音译”为 Mac 编码策略。从头开始改进您的 Mac 编码技术设计。
无论如何,有多种方法可以实现类似的目标。可能最简单的要求线程 B 使用 NSRunLoop
而不是 CFRunLoop
。然后,线程 A 可以使用 -[NSObject performSelector:onThread:withObject:waitUntilDone:]
在线程 B 上运行一个方法。
关于c++ - Mac OS X 上的 PostThreadMessage 等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17480924/