cocos2dx2.0 与cocos2dx3.1 创建线程不同方式总结

来源:互联网 发布:js中bind方法 编辑:程序博客网 时间:2024/05/22 12:17

虽然内容是抄过来的,但是经过了我的验证,而且放在一起就清楚很多了,cocos2dx版本经常变化很大,总会导致这样那样的问题。


cocos2dx2.0 中
1. 头文件
#include <pthread.h>...    pthread_t serial_thread_id; // 起这个名字本打算用在socket上的    int serialThreadStart(void);// 启动线程的方法    static void* serialReceiverFun(void *arg);// 被启动的线程函数,注意必须是静态方法...



2.cpp文件
...int HelloWorld::serialThreadStart(){ int errCode=0;    do {        pthread_attr_t tAttr;        errCode=pthread_attr_init(&tAttr);        CC_BREAK_IF(errCode!=0);        errCode=pthread_attr_setdetachstate(&tAttr, PTHREAD_CREATE_DETACHED);        if(errCode!=0)        {            pthread_attr_destroy(&tAttr);            break;        }        errCode=pthread_create(&serial_thread_id, &tAttr, serialReceiverFun, this);        CCLOGERROR("serial_thread_id=%d\n",&serial_thread_id);    } while (0);    return errCode;}void* HelloWorld::serialReceiverFun(void *arg){ CCLOGERROR("serial thread start"); while(true) {  char buff[BUFSIZE]={0};  int readSize = 0;  readSize = receiverDate(buff,BUFSIZE);  if(readSize > 0)  {   CCLOGERROR("readSize=%d,%s\n",readSize,buff);   sendDate(buff,readSize);  } } return NULL;}...



3. 开启线程
this->serialThreadStart();


cocos2dx3.1 创建线程
在cocos2dx 2.0时代,我们使用的是pthread库,是一套用户级线程库,被广泛地使用在跨平台应用上。但在cocos2dx 3.0中并未发现有pthread的支持文件,原来c++11中已经拥有了一个更好用的用于线程操作的类std::thread。cocos2dx 3.0的版本默认是在vs2012版本,支持c++11的新特性,使用std::thread来创建线程简直方便。
#include <thread>...bool HelloWorld::init(){    if ( !Layer::init() )    {        return false;    } std::thread t1(&HelloWorld::myThread,this);//创建一个分支线程,回调到myThread函数里// t1.join();t1.detach(); CCLOG("in major thread");//在主线程    return true;}void HelloWorld::myThread(){ CCLOG("in my thread");}



t.join()等待子线程myThread执行完之后,主线程才可以继续执行下去,此时主线程会释放掉执行完后的子线程资源。从上面的图片也可以看出,是先输出"in my thread",再输出"in major thread"。
当然了,如果不想等待子线程,可以在主线程里面执行t1.detach()将子线程从主线程里分离,子线程执行完成后会自己释放掉资源。分离后的线程,主线程将对它没有控制权了。


当然了,也可以往线程函数里穿参数,这里用到了bind。下面例子在实例化线程对象的时候,在线程函数myThread后面紧接着传入两个参数。
#include <thread>bool HelloWorld::init(){    if ( !Layer::init() )    {        return false;    }  std::thread t1(&HelloWorld::myThread,this,10,20);//创建一个分支线程,回调到myThread函数里 //t1.join(); t1.detach(); CCLOG("in major thread");//在主线程    return true;}void HelloWorld::myThread(int first,int second){ CCLOG("in my thread,first = %d,second = %d",first,second);}bool HelloWorld::init(){    if ( !Layer::init() )    {        return false;    } std::thread t1(&HelloWorld::myThread,this,10,20);//创建一个分支线程,回调到myThread函数里 //t1.join(); t1.detach(); CCLOG("in major thread");//在主线程    return true;}void HelloWorld::myThread(int first,int second){ CCLOG("in my thread,first = %d,second = %d",first,second);}










2 0
原创粉丝点击