一直以为Cocos2d-x中只有事件队列,只有一个主线程。。。
首先设置头文件
E:\Cocos2d-X\cocos2d-2.1rc0-x-2.1.2\cocos2dx\platform\third_party\win32\pthread
然后添加Lib
pthreadVCE2.lib
pthread_mutex_init(&mutex,NULL);
理解为初始化互斥锁吧。。
pthread_create(&pidgo,NULL,thread_go,0);
创建一个线程,第一个参数是线程ID,第二个描述为空,第三个是线程函数,在这个函数里写需要在线程里执行的事件,第四个是传递参数给函数。
pthread_mutex_lock(&mutex);
在一个线程中操作资源的时候就先把资源锁起来,以免其他线程使用。
pthread_mutex_unlock(&mutex);
线程中使用完毕后就可以把资源释放了。这样别的线程就可以使用资源。
下面是源代码:
HelloWorldScene.h
#pragma once
#include "cocos2d.h"
#include "Box2D/Box2D.h"
#include "SimpleAudioEngine.h"
#include "pthread.h"
#include<string>
class HelloWorld : public cocos2d::CCLayer
{
public:
// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
virtual bool init();
// there's no 'id' in cpp, so we recommand to return the exactly class pointer
static cocos2d::CCScene* scene();
// a selector callback
void menuCloseCallback(CCObject* pSender);
// implement the "static node()" method manually
CREATE_FUNC(HelloWorld);
//Create two function and two tag of thread
pthread_t pidrun,pidgo;
static void* thread_run(void *r);
static void* thread_go(void* r);
};
class Student
{
public :
Student(void){};
Student(std::string name,int age,std::string sex)
{
this->m_age=age;
this->m_name=name;
this->m_sex=sex;
}
~Student()
{
cocos2d::CCLog("delete data");
}
std::string m_name;
std::string m_sex;
int m_age;
};
HelloWorldScene.cpp
#include "HelloWorldScene.h"
#include<windows.h>
using namespace cocos2d;
static int ticket=100;
static pthread_mutex_t mutex;
CCScene* HelloWorld::scene()
{
CCScene * scene = NULL;
do
{
// 'scene' is an autorelease object
scene = CCScene::create();
CC_BREAK_IF(! scene);
// 'layer' is an autorelease object
HelloWorld *layer = HelloWorld::create();
CC_BREAK_IF(! layer);
// add layer as a child to scene
scene->addChild(layer);
} while (0);
// return the scene
return scene;
}
// on "init" you need to initialize your instance
bool HelloWorld::init()
{
bool bRet = false;
do
{
//
// super init first
//
CC_BREAK_IF(! CCLayer::init());
//
// add your codes below...
//
// 1. Add a menu item with "X" image, which is clicked to quit the program.
// Create a "close" menu item with close icon, it's an auto release object.
CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
this,
menu_selector(HelloWorld::menuCloseCallback));
CC_BREAK_IF(! pCloseItem);
// Place the menu item bottom-right conner.
pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));
// Create a menu with the "close" menu item, it's an auto release object.
CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
pMenu->setPosition(CCPointZero);
CC_BREAK_IF(! pMenu);
// Add the menu to HelloWorld layer as a child layer.
this->addChild(pMenu, 1);
// 2. Add a label shows "Hello World".
// Create a label and initialize with string "Hello World".
CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", 24);
CC_BREAK_IF(! pLabel);
// Get window size and place the label upper.
CCSize size = CCDirector::sharedDirector()->getWinSize();
pLabel->setPosition(ccp(size.width / 2, size.height - 50));
// Add the label to HelloWorld layer as a child layer.
this->addChild(pLabel, 1);
// 3. Add add a splash screen, show the cocos2d splash image.
CCSprite* pSprite = CCSprite::create("HelloWorld.png");
CC_BREAK_IF(! pSprite);
// Place the sprite on the center of the screen
pSprite->setPosition(ccp(size.width/2, size.height/2));
// Add the sprite to HelloWorld layer as a child layer.
this->addChild(pSprite, 0);
bRet = true;
} while (0);
return bRet;
}
void HelloWorld::menuCloseCallback(CCObject* pSender)
{
// "close" menu item clicked
//CCDirector::sharedDirector()->end();
Student *temp=new Student(std::string("ThisisGame"),22,std::string("Boy"));
pthread_mutex_init(&mutex,NULL);
pthread_create(&pidrun,NULL,thread_run,temp);
pthread_create(&pidgo,NULL,thread_go,0);
}
void* HelloWorld::thread_run(void* r)
{
Student* s=(Student*)(r);
CCLog("Student age=%d,name=%s,sex=%s",s->m_age,s->m_name.c_str(),s->m_sex.c_str());
//delete s;
while (true)
{
pthread_mutex_lock(&mutex);
if(ticket>0)
{
CCLog("thread run sell %d",ticket);
ticket--;
pthread_mutex_unlock(&mutex);
}
else
{
pthread_mutex_unlock(&mutex);
return NULL;
}
#ifdef WIN32
Sleep(1000);
#else
Usleep(1);
#endif
}
return NULL;
}
void* HelloWorld::thread_go(void* r)
{
while (true)
{
pthread_mutex_lock(&mutex);
if(ticket>0)
{
CCLog("thread go sell %d",ticket);
ticket--;
pthread_mutex_unlock(&mutex);
}
else
{
pthread_mutex_unlock(&mutex);
return NULL;
}
#ifdef WIN32
Sleep(1000);
#else
Usleep(1);
#endif
}
return NULL;
}
程序运行结果:
然后是工程打包:
http://download.csdn.net/detail/cp790621656/5905699