尽管内容是抄过来的。可是经过了我的验证。并且放在一起就清楚非常多了,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 创建线程不同方式总结的更多相关文章

  1. 创建线程的方式三:实现Callable接口-----JDK5.0 新增

    package com.yhqtv.java2; /* * 创建线程的方式三:实现Callable接口-----JDK5.0 新增 * * 如何理解实现Callable接口的方式创建多线程比实现Run ...

  2. 创建线程的方式三:实现Callable接口 --- JDK 5.0新增

    /** * 创建线程的方式三:实现Callable接口. --- JDK 5.0新增 * * * 如何理解实现Callable接口的方式创建多线程比实现Runnable接口创建多线程方式强大? * 1 ...

  3. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

  4. Java多线程学习总结--线程概述及创建线程的方式(1)

    在Java开发中,多线程是很常用的,用得好的话,可以提高程序的性能. 首先先来看一下线程和进程的区别: 1,一个应用程序就是一个进程,一个进程中有一个或多个线程.一个进程至少要有一个主线程.线程可以看 ...

  5. 7. Callable 创建线程的方式三

    package com.gf.demo06; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionEx ...

  6. java线程(1)——三种创建线程的方式

    前言 线程,英文Thread.在java中,创建线程的方式有三种: 1.Thread 2.Runnable 3.Callable 在详细介绍下这几种方式之前,我们先来看下Thread类和Runnabl ...

  7. java线程——三种创建线程的方式

    前言 线程,英文Thread.在java中,创建线程的方式有三种: 1.Thread 2.Runnable 3.Callable 在详细介绍下这几种方式之前,我们先来看下Thread类和Runnabl ...

  8. java中创建线程的方式

    创建线程的方式: 继承thread 实现runnable 线程池 FurureTask/Callable 第一种:继承thread demo1: public class demo1 { public ...

  9. Java之创建线程的方式四:使用线程池

    import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.c ...

随机推荐

  1. s5pv210 uboot-2012-10移植(二) 之能够启动进入控制台

    这次我们将从官网下载的最新uboot-2012-10移植到s5pv210开发板上,让其进入控制台,效果如下: 首先,我暂时没采用内核的SPL,这个将在后面给补上,这里的BL1是我自己参考资料写的,我用 ...

  2. 新手须知 QT类大全

    QT类大全,在行内容中罗列出来了,希望大家多看看,如果是API就更好了,但可惜不是.这些是一些大类,请多做参考. QApplication 应用程序类 QLabel 标签类 QPushButton 按 ...

  3. pytorch 7 save_reload 保存和提取神经网络

    import torch import matplotlib.pyplot as plt # torch.manual_seed(1) # reproducible # fake data x = t ...

  4. Unity 多场景打包

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50580641 作者:car ...

  5. webpack加载器(Loaders)

    加载器(Loaders) loader 是对应用程序中资源文件进行转换.它们是(运行在 Node.js 中的)函数,可以将资源文件作为参数的来源,然后返回新的资源文件. 示例 例如,你可以使用 loa ...

  6. java中 flush()方法的作用

    flush() 是清空,而不是刷新啊.一般主要用在IO中,即清空缓冲区数据,就是说你用读写流的时候,其实数据是先被读到了内存中,然后用数据写到文件中,当你数据读完的时候不代表你的数据已经写完了,因为还 ...

  7. HDU 4310 Contest 2

    贪心,注意排序条件. #include <iostream> #include <cstdio> #include <algorithm> using namesp ...

  8. linux /proc/cpuinfo 文件描写叙述

    processor :系统中逻辑处理核的编号.对于单核处理器.则课觉得是其CPU编号,对于多核处理器则能够是物理核.或者使用超线程技术虚拟的逻辑核 vendor_id :CPU制造商 cpu fami ...

  9. ubuntu16.04通过ipv6进行学术搜索

    https://www.polarxiong.com/archives/%E8%A7%A3%E5%86%B3ubuntu%E4%B8%8Bipv6%E8%BF%9E%E6%8E%A5%E4%B8%80 ...

  10. nyoj--1239--引水工程(最小生成树)

    引水工程 时间限制:2000 ms  |  内存限制:65535 KB 难度: 描述 南水北调工程是优化水资源配置.促进区域协调发展的基础性工程,是新中国成立以来投资额最大.涉及面最广的战略性工程,事 ...