尽管内容是抄过来的。可是经过了我的验证。并且放在一起就清楚非常多了,cocos2dx版本号常常变化非常大。总会导致这样那样的问题。

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


2.cpp文件
  1. ...
  2. int HelloWorld::serialThreadStart()
  3. {
  4. int errCode=0;
  5. do {
  6. pthread_attr_t tAttr;
  7. errCode=pthread_attr_init(&tAttr);
  8. CC_BREAK_IF(errCode!=0);
  9. errCode=pthread_attr_setdetachstate(&tAttr, PTHREAD_CREATE_DETACHED);
  10. if(errCode!=0)
  11. {
  12. pthread_attr_destroy(&tAttr);
  13. break;
  14. }
  15. errCode=pthread_create(&serial_thread_id, &tAttr, serialReceiverFun, this);
  16. CCLOGERROR("serial_thread_id=%d\n",&serial_thread_id);
  17. } while (0);
  18. return errCode;
  19. }
  20. void* HelloWorld::serialReceiverFun(void *arg)
  21. {
  22. CCLOGERROR("serial thread start");
  23. while(true)
  24. {
  25. char buff[BUFSIZE]={0};
  26. int readSize = 0;
  27. readSize = receiverDate(buff,BUFSIZE);
  28. if(readSize > 0)
  29. {
  30. CCLOGERROR("readSize=%d,%s\n",readSize,buff);
  31. sendDate(buff,readSize);
  32. }
  33. }
  34. return NULL;
  35. }
  36. ...


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

cocos2dx3.1 创建线程
在cocos2dx 2.0时代,我们使用的是pthread库。是一套用户级线程库,被广泛地使用在跨平台应用上。

但在cocos2dx 3.0中并未发现有pthread的支持文件。原来c++11中已经拥有了一个更好用的用于线程操作的类std::thread。cocos2dx 3.0的版本号默认是在vs2012版本号,支持c++11的新特性,使用std::thread来创建线程简直方便。

  1. #include <thread>
  2. ...
  3. bool HelloWorld::init()
  4. {
  5. if ( !Layer::init() )
  6. {
  7. return false;
  8. }
  9.  
  10. std::thread t1(&HelloWorld::myThread,this);//创建一个分支线程,回调到myThread函数里
  11. // t1.join();
  12. t1.detach();
  13.  
  14. CCLOG("in major thread");//在主线程
  15.  
  16. return true;
  17. }
  18.  
  19. void HelloWorld::myThread()
  20. {
  21. CCLOG("in my thread");
  22. }


t.join()等待子线程myThread运行完之后,主线程才干够继续运行下去。此时主线程会释放掉运行完后的子线程资源。从上面的图片也能够看出,是先输出"in
my thread",再输出"in major thread"。

当然了,假设不想等待子线程,能够在主线程里面运行t1.detach()将子线程从主线程里分离,子线程运行完毕后会自己释放掉资源。

分离后的线程,主线程将对它没有控制权了。



当然了。也能够往线程函数里穿參数,这里用到了bind。

以下样例在实例化线程对象的时候,在线程函数myThread后面紧接着传入两个參数。

  1. #include <thread>
  2. bool HelloWorld::init()
  3. {
  4. if ( !Layer::init() )
  5. {
  6. return false;
  7. }
  8.  
  9. std::thread t1(&HelloWorld::myThread,this,10,20);//创建一个分支线程,回调到myThread函数里
  10. //t1.join();
  11. t1.detach();
  12.  
  13. CCLOG("in major thread");//在主线程
  14. return true;
  15. }
  16.  
  17. void HelloWorld::myThread(int first,int second)
  18. {
  19. CCLOG("in my thread,first = %d,second = %d",first,second);
  20. }
  21. bool HelloWorld::init()
  22. {
  23. if ( !Layer::init() )
  24. {
  25. return false;
  26. }
  27.  
  28. std::thread t1(&HelloWorld::myThread,this,10,20);//创建一个分支线程。回调到myThread函数里
  29. //t1.join();
  30. t1.detach();
  31.  
  32. CCLOG("in major thread");//在主线程
  33. return true;
  34. }
  35.  
  36. void HelloWorld::myThread(int first,int second)
  37. {
  38. CCLOG("in my thread,first = %d,second = %d",first,second);
  39. }






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. tomcat 映射虚拟路径

    编辑server.xml   在  <Host></Host>中添加 <Context path="/renbao/img/" docBase=&qu ...

  2. eclipse引入svn插件,并将项目同步到svn

    1. eclipse中不存在SVN问题的解决 1.1发现Team->Share project 下没有svn. 1.2下载安装svn插件. 选择help->Eclipse Marketpl ...

  3. 关于C++的一些函数的使用方法

    关于C++的一些函数的使用方法: http://www.shouce.ren/api/c/index.html

  4. [using_microsoft_infopath_2010]Chapter1 介绍InfoPath2010

    本章提要 1.列举对于就SharePoint2010来说使用InfoPath2010的好处 2.使用Office后台函数创建InfoPath表单 3.使用InfoPath接口 4.创建基于XML的文件 ...

  5. JavaCodeTra 36选7 彩票抽奖

    想写个小代码试试自己的运气.然并卵.并不能猜中 import java.util.Random; import java.util.Scanner; /** * */ /** * @author Ha ...

  6. FPGA实现网络通信时的网络字节序问题

    在上位机软件发送字符abcd 在鲨鱼上抓包 用逻辑分析仪从FPGA网络接收管脚分析 数据接收后存储在位宽为8bit的ram中 从ram中读32bitUDP数据为 64636261 依据以上那个现象, ...

  7. 【SPOJ-GSHOP】Rama and Friends【贪心】【细节】

    题意: 给出n个非严格递增的整数(可能有负数),必须操作k次.每次能够把当中一个数变为它的相反数,使得终于的数列和最大. 输出这个最大和. 考验怎样出坑数据卡自己的程序... #include < ...

  8. 百度分页效果之纯jsp版

    数据库连接工具类 package com.gao.page.utils; import java.sql.Connection; import java.sql.DriverManager; publ ...

  9. LintCode-交叉字符串

    给出三个字符串:s1.s2.s3,推断s3是否由s1和s2交叉构成. 您在真实的面试中是否遇到过这个题? Yes 例子 比方 s1 = "aabcc" s2 = "dbb ...

  10. Linux xhost命令详解

    xhost 命令用途 控制什么人可以访问当前主机上的增强 X-Windows. 语法 xhost [ + | - ] [ Name ] "+"表示增加,"-"表 ...