您的位置:首页 > 移动开发 > Cocos引擎

cocos2dx之多线程

2016-05-25 21:11 471 查看
在c++11中,加入了std::thread。所以在cocos2dx中我们可以使用这个来方便我们的开发。

头文件
<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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos2d-x 多线程 线程