2013-07-05 66 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'指針。我建議的方法肯定是作爲運行循環源或某種定時器在引擎蓋下實現的。爲什麼重新實施已提供的內容? –