【发布时间】:2014-02-06 14:43:19
【问题描述】:
我是一名 iOS 程序员,目前正在使用 Cocos2d-X 创建 Android-iOS 应用。
我想在后台线程中运行一个函数(解压缩文件,需要 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类使用互斥体将后台线程的结果添加到线程安全数组中。并且在主线程中持续运行的方法来检查线程安全数组中是否有任何东西。这是一种解决方法,但我认为对于这样一个简单的任务来说真的很丑。)
【问题讨论】:
-
不是 Mac 程序员,所以我不理解您示例中的库调用,但一个线程绝不可能调用另一个线程中的函数。线程可以通信,一个线程可以向另一个线程发送消息,要求接收者调用函数 f(),但接收者必须期待消息、接收消息并自愿服从。
-
谢谢,我想我将必须使用一个通用的、线程安全的容器对象来传递消息。
-
其实我很久以前就尝试过Mac编程WAY。那时,Mac 程序的 main() 例程通常会处于循环中,等待事件,并根据需要调用函数来处理事件。当时没有“其他线程”,但如果有,那么我可以想象另一个线程发布“回调”事件。
标签: multithreading callback posix cocos2d-x background-thread