c++ - Mac OS X 上的 PostThreadMessage 等效项

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

最佳答案

作为一般性建议,您应该对移植工作采取不同的策略。不要试图将 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/

相关文章:

ios - 在 OS X 上使用 nm(1) 列出为 arm64 构建的目标文件中的符号

clCreateImage2D - 加载 RGB 图像

Python导入MySQLdb : Library not loaded: libmysqlclient. 18.dylib

macos - NSTableView:选择不可编辑的单元格而不是行

c++ - 在共享对象文件中设置 gdb 断点

c - 在 C 中定义类似 int 的类型

c++ - 在混合 C/C++ 程序中协调 malloc 和 new 的 "correct"方法是什么?

c++ - 我应该考虑网络字节顺序吗?

c++ - 重构厚客户端遗留应用程序

c++ - 将 boost::qi::rule 与 BOOST_FUSION_ADAPT_STRUCT 一起使用的正确方法是什么?