0

我正在将应用程序移植到 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。

窗口代码:

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 上的等效功能。

4

1 回答 1

1

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

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

于 2013-07-05T08:37:03.970 回答