zoukankan      html  css  js  c++  java
  • cocos2dx2.0 与cocos2dx3.1 创建线程不同方式总结

    尽管内容是抄过来的。可是经过了我的验证。并且放在一起就清楚非常多了,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
    ",&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
    ",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);
    }










  • 相关阅读:
    前后端项目结构规范性记录
    开发问题记录(这部分还是比较零碎)
    对HashMap的一次记录
    面试问题记录 三 (JavaWeb、JavaEE)
    面试问题记录 二 (数据库、Linux、Redis)
    面试问题记录 一 (基础部分)
    对正则表达式的一些记录
    WEB与游戏开发的一些区别
    MarkDown常用语法全纪录
    MySQL压测相关内容
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6994670.html
Copyright © 2011-2022 走看看