c++11,cocos2d 3.x多线程std::thread demo

std::thread
 1. 在cocos2dx中,子线程不能用于更新主界面,更新界面是主线程的事
 2. 在cocos2dx中,只有 
Director::getInstance()->getScheduler()->performFunctionInCocosThread

方法可以调用

//
//  OneScene.cpp
//  helloworld
//
//  Created by liqiangxo on 17/3/4.
//
//
#include "OneScene.hpp"
#include "unistd.h"
#include "Onebody.hpp"
OneScene* OneScene::getInstance(){
    static OneScene* _instance = nullptr;
    if (_instance == nullptr) {
        _instance = new OneScene;
        _instance->init();
    }
    return _instance;
}
bool OneScene::init(){
    tickets = 1000;//1000张票

    std::thread tA(&OneScene::myThreadA,this);//创建一个分支线程,回调到myThread函数里
    std::thread tB(&OneScene::myThreadB,this);
    tA.detach();
    tB.detach();
    //  t1.detach();
    CCLOG("in major thread");//在主线程
    return true;
}

void OneScene::setSpriteName1(Texture2D * filename){
    bodufilename1 = filename;
}
void OneScene::setSpriteName2(Texture2D * filename){
    bodufilename2 = filename;
}
void addBody1(){

    auto scene = Director::getInstance()->getRunningScene();
    auto sp = Sprite::createWithTexture(OneScene::getInstance()->bodufilename1);
    sp->setPosition(Vec2(rand_0_1()*Director::getInstance()->getWinSize().width ,rand_0_1()*Director::getInstance()->getWinSize().height));
    scene->addChild(sp,1000);
}
void addBody2(){

    auto scene = Director::getInstance()->getRunningScene();
    auto sp = Sprite::createWithTexture(OneScene::getInstance()->bodufilename2);
    sp->setPosition(Vec2(rand_0_1()*Director::getInstance()->getWinSize().width ,rand_0_1()*Director::getInstance()->getWinSize().height));
    scene->addChild(sp,1000);
}

void OneScene::myThreadA()
{
    while(true)
    {
        mutexa.lock();//加锁
        if(tickets>0)
        {
            if(tickets == 1000){
                sleep(5);
            }
            sleep(1);
            Director::getInstance()->getScheduler()->performFunctionInCocosThread(addBody1);
            CCLOG("A Sell %d",tickets--);//输出售票,每次减1
            mutexa.unlock();//解锁
        }
        else {
            mutexa.unlock();
            break;

        }
    }
}
void OneScene::myThreadB()
{
    while(true)
    {
        mutexa.lock();
        if (tickets>0)
        {
            if(tickets == 1000){
                sleep(5);
            }
            sleep(1);

            Director::getInstance()->getScheduler()->performFunctionInCocosThread(addBody2);
            CCLOG("B Sell %d",tickets--);
            mutexa.unlock();
        }
        else
        {
            mutexa.unlock();
            break;
        }
    }
}
//
//  OneScene.hpp
//  helloworld
//
//  Created by liqiangxo on 17/3/4.
//
//

#pragma once
#ifndef OneScene_hpp
#define OneScene_hpp

#include <stdio.h>
#include "cocos2d.h"
USING_NS_CC;

class OneScene {
public:
    static OneScene* getInstance();
    virtual bool init();

    void myThreadA();//线程A
    void myThreadB();//线程B
    Texture2D * bodufilename1;
    void setSpriteName1(Texture2D * filename);
    Texture2D * bodufilename2;
    void setSpriteName2(Texture2D * filename);
    std::mutex  mutexa;
    int tickets;//票数
};
#endif /* OneScene_hpp */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值