Mac OS X上的PostThreadMessage等价物

时间:2013-07-05 04:08:24

标签: c++ c macos core-foundation

我正在将应用程序移植到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上使用相同的功能。

1 个答案:

答案 0 :(得分:1)

作为一般建议,您应该采取不同的方法来进行移植。不要试图将Win32编码策略“音译”为Mac。从头开始修改Mac编码技术的设计。

无论如何,有各种方法可以实现类似的东西。可能最简单的要求线程B使用NSRunLoop而不是CFRunLoop。然后,线程A可以使用-[NSObject performSelector:onThread:withObject:waitUntilDone:]在线程B上运行方法。