我正在将应用程序移植到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上使用相同的功能。
答案 0 :(得分:1)
作为一般建议,您应该采取不同的方法来进行移植。不要试图将Win32编码策略“音译”为Mac。从头开始修改Mac编码技术的设计。
无论如何,有各种方法可以实现类似的东西。可能最简单的要求线程B使用NSRunLoop
而不是CFRunLoop
。然后,线程A可以使用-[NSObject performSelector:onThread:withObject:waitUntilDone:]
在线程B上运行方法。