Cocos2d-X多线程(1) 在cocos2d-x中使用多线程

教科书上说:进程是资源分配的最小单位,线程是CPU调度的最小单位。
进程是程序在计算机上的一次执行活动。直观的讲就是会产生一个pid。
int main()
{
    //业务逻辑代码
    return 0;
}
当进入main函数时就会创建一个进程。
线程是可执行代码的可分派单元。线程把一个进程分为很多片,每一片都可以是一个独立的流程。
为什么使用多线程和多进程:
为了实现并发执行,就是在同一时间同时执行多条任务。这样可以提高程序效率。
 
在cocos2d-x中使用多线程:
游戏中的界面体验很重要,最基本的条件就是流程性,并且在cocos2d开发的游戏中,每帧都要刷新一下界面,按60fps算,每秒刷新60次。所以可以把耗时的操作放到其他线程中,就不会对界面线程造成影响。

cocos2d-x 3.0系列版本使用了c++11,C++11提供了一个更好的用于线程操作的类std::thread,std::thread 在 <thread> 头文件中声明,因此使用 std::thread 时需要包含 <thread> 头文件。
std::thread 常用构造函数:
1、默认构造函数:thread()
  默认构造函数,创建一个空的 thread 执行对象
     std::thread t1;
2、初始化构造函数:template <class Fn, class... Args>
  初始化构造函数,创建一个 thread对象,该 thread对象可被 joinable,新产生的线程会调用 fn 函数,该函数的参数由 args 给出。
     std::thread t2(f1, 10);
常用函数:
1、get_id
   获取线程 ID。
2、joinable
   检查线程是否可被 join。
3、join
   Join 线程。待子线程执行完之后,主线程才可以继续执行下去,此时主线程会释放掉执行完后的子线程资源
4、detach
   Detach 线程
   将子线程从主线程里分离,子线程执行完成后会自己释放掉资源。分离后的线程,主线程将对它没有控制权了。
 


代码实操:

头文件:

#ifndef __TestThread_SCENE_H__
#define __TestThread_SCENE_H__

#include "cocos2d.h"


USING_NS_CC;

class TestThread : public cocos2d::Layer
{
public:
    static cocos2d::Scene* createScene();
    virtual bool init();
	CREATE_FUNC(TestThread);
	
	Label *lblInit;
	void threadA(int first,std::string second);
};

#endif // __TestThread_SCENE_H__

源文件:

#include "TestThread.h"
#include <thread>

Scene* TestThread::createScene()
{
    auto scene = Scene::create();
    auto layer = TestThread::create();
    scene->addChild(layer);
    return scene;
}

bool TestThread::init()
{
    if ( !Layer::init() )
    {
        return false;
    }

	Size size = Director::getInstance()->getVisibleSize();
	lblInit = Label::create("hi","Arial",24);
	addChild(lblInit);
	lblInit->setPosition(size/2);

	// 创建一个线程
	std::thread t1(&TestThread::threadA,this,10,"I am a string");
	// 分离线程
	t1.detach();
	lblInit->setString("main thread");
	
    return true;
}
void TestThread::threadA(int first,std::string second)
{
	std::this_thread::sleep_for(std::chrono::seconds(3));
	lblInit->setString("threadA");
	log("threadA first = %d,second = %s",first,second.c_str());
}


 
 

原文地址:https://www.cnblogs.com/lmx282110xxx/p/10798712.html