在cocos2d-x里面用多线程还是乖乖的用pthread吧。应用一启动时创建线程作为逻辑线程。
创建方法如下:
extern ResourcePool logicThreadResource;voID *test(voID *param){ while (true) { if (logicThreadResource.peekNextDataLength()) { printf("有数据需要处理"); int datasize = 0; char *receiveData = new char[512]; logicThreadResource.popData(receiveData,datasize,512); int sigal = *((int32_t *) receiveData); printf("the sigal is %d\n",sigal); if (sigal == 100) { CalWinRate(receiveData+4); } delete[] receiveData; }else{ pthread_mutex_lock(&locklogicthread); pthread_cond_wait(&cond,&locklogicthread); pthread_mutex_unlock(&locklogicthread); } } return NulL;}voID create_pthread(){ // 启动两个测试的主线程 pthread_t tID; pthread_create(&tID,NulL,test,NulL);}pthread_create原型为:PTW32_DLLPORT int PTW32_CDECL pthread_create(pthread_t *tID,const pthread_attr_t *attr,voID*(*start)(voID *),voID *arg)。create有四个参数,第一个是pthread_t,第二个是创建线程的参数,第三个是线程的入口函数,第四个为入口函数参数。这里需要注意的是设置pthread_cond_wait即唤醒函数的时候一定要加锁。启动函数如下:
bool ResourcePool::pushData(const char *data,int size){ autoReleaseLock myLock = autoReleaseLock();// deal int realSize = size + sizeof(int32_t); int needMemory = bufferLength + realSize; if (needMemory > bufferCapacity) {// 需要重新分配内存 if (reMollocmemory(needMemory)) { }else{ return false; } }// char *pWriteBuff = resPool + bufferLength; *((int32_t *)pWriteBuff) = size; pWriteBuff += sizeof(int32_t); bufferLength += sizeof(int32_t); memmove(pWriteBuff,data,size); bufferLength += size; // 缓冲区有数据的话就激活线程 pthread_cond_signal(&cond); return true;}
思路还是采用的是我上篇博客的思路,至于cocos2d-x里面的调用我是这样的:
local handlerlocal scheduler = CCDirector:sharedDirector():getScheduler()handler = scheduler:scheduleScriptFunc(function() -- 每帧检测一下数据,看看是否是合理的 BookUtils:parsePackagetoLua() if GLOABLEPACKAGE ~= "" then -- 解析数据 local package = Json.decode(GLOABLEPACKAGE) print("the GLOABLEPACKAGE is " .. GLOABLEPACKAGE) GLOABLEPACKAGE = "" local datatable = {} table.walk(package,function(val,key) if tonumber(key) ~= 1 then datatable[#datatable+1] = val end end) if tonumber(package[1]) == 100 then -- 胜率计算器,更新胜率 CCNotificationCenter:sharednotificationCenter():postNotification("CAL_WIN_RATE_UPDATE",CCString:create(Json.encode(datatable))) elseif tonumber(package[1]) == 101 then -- 胜率计算完毕 CCNotificationCenter:sharednotificationCenter():postNotification("CAL_WIN_RATE_UPDATE_END") end end end,false)即主线程每一帧去检测缓冲区,如果有数据,则发送消息。 总结
以上是内存溢出为你收集整理的pthread使用实例全部内容,希望文章能够帮你解决pthread使用实例所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)