cocos2dx之多线程
2016-05-25 21:11
471 查看
在c++11中,加入了std::thread。所以在cocos2dx中我们可以使用这个来方便我们的开发。
头文件
常用的方法
使用示例:
std::thread绑定函数很灵活,支持std::bind、lambda表达式
既然多线程有了,那肯定也得有线程锁,同样,在c++11中提供了
当然,在简单的应用场景下,我们一般使用std::mutex
使用示例:
但是在cocos2dx中,主线程是有保护的,不允许子线程对ui进行操作
所以我们需要用到一个方法,把子线程的部分代码放到主线程中去执行
如果是需要在子线程中处理socket I/O操作,那么不建议这样子直接对主线程进行操作。
可以使用coco中事件进行操作
头文件
<thread>
常用的方法
void join(); void detach(); bool joinable() const _NOEXCEPT; id get_id() const _NOEXCEPT;
使用示例:
#include <iostream> #include <thread> void thread1() { std::cout << "thread1\n"; } int main(void) { std::thread th1(&thread1); th1.detach(); std::thread th2(std::bind(thread1)); th2.detach(); std::thread th3([] {std::cout << "thread3\n"; }); th3.detach(); std::thread([] {std::cout << "thread4\n"; }).detach(); while (1); }
std::thread绑定函数很灵活,支持std::bind、lambda表达式
既然多线程有了,那肯定也得有线程锁,同样,在c++11中提供了
//头文件<mutex> //独占式互斥量 std::mutex //递归式互斥量 std::recursive_mutex //允许超时的独占式互斥量 std::timed_mutex //允许超时的递归式互斥量 std::recursive_timed_mutex
当然,在简单的应用场景下,我们一般使用std::mutex
使用示例:
#include <thread> #include <mutex> int i = 0; std::mutex myMutex; void myThread() { while (1) { myMutex.lock(); i++; std::cout << i << std::endl; myMutex.unlock(); Sleep(100); } } int main(void) { std::thread(myThread).detach(); std::thread(myThread).detach(); while (1); }
但是在cocos2dx中,主线程是有保护的,不允许子线程对ui进行操作
所以我们需要用到一个方法,把子线程的部分代码放到主线程中去执行
Director::getInstance()->getScheduler()->performFunctionInCocosThread([&, this] { //比如说这里需要切换场景 auto scene = NextScene::createScene(); Director::getInstance()->replaceScene(scene); });
如果是需要在子线程中处理socket I/O操作,那么不建议这样子直接对主线程进行操作。
可以使用coco中事件进行操作
//订阅一个信号为1的消息 NotificationCenter::getInstance()->addObserver(this, callfuncO_selector(HelloWorld::onMsg), "1", NULL); //然后在线程中,当有消息到来,可以发送一个继承自Ref的实例过去 NotificationCenter::getInstance()->postNotification(buf, myJson); //消息处理函数,这里可以取出发送的数据 onMsg(Ref * pData)
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- C#实现多线程的同步方法实例分析
- C#线程间不能调用剪切板的解决方法
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- C#线程同步的三类情景分析
- C#获取进程或线程相关信息的方法
- 简单对比C#程序中的单线程与多线程设计
- C#停止线程的方法
- 解析C#多线程编程中异步多线程的实现及线程池的使用
- C#子线程更新UI控件的方法实例总结
- C#多线程学习之(六)互斥对象用法实例
- C#线程队列用法实例分析
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- 分享我在工作中遇到的多线程下导致RCW无法释放的问题