Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading POSIX回调到主线程_Multithreading_Callback_Posix_Cocos2d X_Background Thread - Fatal编程技术网

Multithreading POSIX回调到主线程

Multithreading POSIX回调到主线程,multithreading,callback,posix,cocos2d-x,background-thread,Multithreading,Callback,Posix,Cocos2d X,Background Thread,我是一名iOS程序员,目前正在使用Cocos2d-X创建Android iOS应用程序 我想在后台线程中运行一个函数(解压缩一个文件,需要2-3秒),当它准备好时,我想回调到主线程。在解压过程中,有一个小的加载程序动画,它必须运行 使用GCD,这是一项非常简单的任务: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // Unzipping here. dispa

我是一名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阻塞了主线程,这会停止加载动画。这是我使用的教程:


(内置的CCHttpRequest类使用互斥体将结果从后台线程添加到线程安全数组。在主线程中有一个持续运行的方法来检查线程安全数组中是否有任何内容。这是一个解决方法,但我认为对于这样一个简单的任务来说,这真的很难看。)

使用此命令在cocos2d的主线程中运行代码:

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

不是Mac程序员,所以我不理解您示例中的库调用,但一个线程永远不可能调用另一个线程中的函数。线程可以通信,一个线程可以向另一个线程发送消息,要求接收者调用函数f(),但接收者必须期待消息,接收消息,并自愿遵守。谢谢,我想我必须使用一个通用的线程安全容器对象来传递消息。实际上,我很久以前就尝试过Mac编程方式。在那时,Mac程序的main()例程通常位于循环中,等待事件,并根据需要调用函数来处理事件。当时没有“其他线程”,但如果有,我可以想象另一个线程发布“回调”事件