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\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);
}

cocos2dx2.0 与cocos2dx3.1 创建线程不同方式总结,布布扣,bubuko.com

时间: 2024-08-08 21:55:16

cocos2dx2.0 与cocos2dx3.1 创建线程不同方式总结的相关文章

线程八大基础核心一(创建线程的方式)

1.引子 在java多线程并发编程中,有八大基础核心.考考你:看看都有哪八大基础核心呢?它们分别是: 1.创建线程的方式 2.线程启动 3.线程停止 4.线程生命周期 5.线程相关的方法 6.线程相关的属性 7.线程异常处理 8.线程安全 今天我们从第一个基础核心开始:创建线程的方式 2.考考你 #考考你: 你知道在java编程语言中,有几种创建线程的方式吗? #参考如下:网友说法.官方文档 网友说法: 官方文档说法: #说法比较: 在网络上,关于创建线程的方式.主流的说法有四种:继承Threa

Java创建线程的方式

①继承Thread类(真正意义上的线程类),是Runnable接口的实现. ②实现Runnable接口,并重写里面的run方法. ③使用Executor框架创建线程池.Executor框架是juc里提供的线程池的实现. 调用线程的start():启动此线程:调用相应的run()方法 继承于Thread类的线程类,可以直接调用start方法启动线程(使用static也可以实现资源共享).一个线程(对象)只能够执行一次start(),而且不能通过Thread实现类对象的run()去启动一个线程. 实

创建线程的方式

需要复写run方法,把要执行的任务放在run方法中. 达到了我们预期的效果. 线程的使用细节: 线程的启动使用父类的start()方法 如果线程对象直接调用run(),那么JVN不会当作线程来运行,会认为是普通的方法调用. 线程的启动只能由一次,否则抛出异常 可以直接创建Thread类的对象并启动该线程,但是如果没有重写run(),什么也不执行. 匿名内部类的线程实现方式

java 线程Thread 技术--创建线程的方式

在第一节中,对线程的创建我们通过看文档,得知线程的创建有两种方式进行实现,我们进行第一种方式的创建,通过继承Thread 类 ,并且重写它的run 方法,就可以进行线程的创建,所有的程序执行都放在了run 方法里:可以说run 方法里放入的是线程执行的程序:在执行线程的时候,需要调用线程的start 方法,就可以进行线程的启动: 总之就是:代码写在run 方法里面,但是线程的执行调用start 方法,start 方法会开启一个线程去执行run 方法: 方式-: public class Thre

多线程基础:两种常见的创建线程的方式

一 通过继承Thread 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package thread; public class ThreadDemo1 {     public static void main(String[] args) {         Demo1 demo1 = new Demo1("zifangsky");         Demo1 demo2 = new Demo1(

创建线程的两种方式

首先我们需要知道什么是线程:是程序执行流的最小单元,包括就绪.阻塞和运行三种基本状态. 举个简单的例子:我们把生活中的两件事吃饭和写作业当作是两个线程,当你正在写作业的时候,爸妈叫你吃饭,你就直接去了,等吃完饭回来后再接着写作业.这就是相当于两个线程其中一个从运行状态转入就绪状态,另一个线程从就绪状态转入运行状态. 创建线程包括继承Thread类和实现Runnable接口两种方式(JDK5.0以后还包括了实现Callable等方式来实现线程,这里不做介绍,感兴趣的小伙伴可以自己查资料),下面介绍

Java创建线程的细节分析

转载:http://shmilyaw-hotmail-com.iteye.com/blog/1880902 前言 关于线程创建的问题,可以说是老生常谈了.在刚开始学习Thread的时候基本上都会接触到,用简单的一两句话就可以概括起来.一个是创建类实现Runnable接口,然后将该类的实例作为参数传入到Thread构造函数中.再调用Thread对象的start方法.还有一种是继承Thread类,覆写run方法.然后在该对象实例中调用start方法.那么,这两种方式在什么情况下适用呢?还有,既然我们

iOS开发多线程篇—创建线程

iOS开发多线程篇—创建线程 一.创建和启动线程简单说明 一个NSThread对象就代表一条线程 创建.启动线程 (1) NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; [thread start]; // 线程一启动,就会在线程thread中执行self的run方法 主线程相关用法 + (NSThread *)mainThread; // 获得主线程 -

创建线程方式-NSThread

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: pointer; position: absolute