2014-02-06 65 views
0

我是一位iOS程序員,他目前正在使用Cocos2d-X創建Android-iOS應用程序。POSIX對主線程的回調

我想在後臺線程中運行一個函數(解壓縮一個文件,需要2-3秒),當它準備好時我想回調主線程。在解壓縮過程中有一個小的加載器動畫,它必須運行。

這是一個非常簡單的任務與GCD:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    // Unzipping here. 

    dispatch_async(dispatch_get_main_queue(),^{ 
     [self callbackWithResult:result]; // Call some method and pass the result back to main thread 
    }); 

}); 

但在這裏我必須使用POSIX是平臺無關的。閱讀一些教程,但我能做的最好的是在完成後將後臺線程加入主線程。問題在於,pthread_join會阻止主線程,從而阻止我的加載動畫。這是我使用的教程:https://computing.llnl.gov/tutorials/pthreads/#Joining

(內置的CCHttpRequest類使用互斥體將結果從後臺線程添加到線程安全數組中,並在主線程中連續運行以檢查是否有任何內容。線程安全的數組這是一個解決辦法,但我認爲是這樣一個簡單的任務真的很醜)

+1

不是Mac程序員,所以我不明白在你的例子中的庫調用,但它是*從*可能的一個線程調用另一個線程中的函數。線程可以進行通信,並且一個線程可以向另一個線程發送消息,要求收件人調用函數f(),但收件人必須期待該消息,接收消息並自願遵守它。 –

+0

謝謝,我想我會使用一個通用的,線程安全的容器對象來傳遞消息。 – SPQR3

+0

其實,我很早以前就試過Mac編程* WAY *。那時,Mac程序的main()例程通常會坐在一個循環中,等待事件,並根據需要調用函數來處理事件。當時沒有「其他線程」,但如果有的話,我可以想象另一個線程發佈「回調」事件。 –

回答

0

使用此功能可以在cocos2d的主線程中運行代碼:

Director::getInstance()->getScheduler()->performFunctionInCocosThread([]{ 
    // execution in main thread 
});