2013-07-05 49 views
0

我正在将应用程序移植到Mac OS X.Mac OS X上的PostThreadMessage等效项

我还需要在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

任何旧的集合类和某些线程锁定有什么问题? – trojanfoe

+0

我对Mac OS X相当陌生。我不知道如何在Mac OS X上实现这一点。我只是想在Mac OS X上实现相同的功能。如果可以使用线程锁定,请发布示例。 – doptimusprime

+0

为了更清楚,我添加了代码示例。 – doptimusprime

回答

1

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

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

+0

我没有维护NSThread对象。线程A只有线程B的id。请在CFRunLoop中提供解决方案或使用Posix线程(如锁)。即使它需要实现自定义运行循环源,我也可以做到。 – doptimusprime

+1

只需要线程ID就几乎没有任何兴趣。为什么你坚持只有一个线程ID才能满足你的程序需求?任何使用锁定或自定义运行循环源的解决方案仍然需要您维护对某些共享数据结构的引用。一旦你接受了这个要求,你的共享数据结构也可能是一个'NSThread'指针。我建议的方法肯定是作为运行循环源或某种定时器在引擎盖下实现的。为什么重新实施已提供的内容? –