phoenixdown:
原来的代码取得size后,就unlock了,在进入while前就可能在别的线程里g_quene的的size发生变化,比如变成0了进入while后就会报错了
但是在使用g_queue前有再次获取锁啊。不过你的做法是使得逻辑更清晰一些。
phoenixdown:
然后今天断点又不好使了,但是不会C++那边不会报错了
有报什么问题吗?
@minggo
断点不好使的问题找到了, 是我为了区分app和h5版本的main.js改了man.js的名字造成的,
cocos-debug的cocosFXDebug.js 里main.js的名字是固定的,
我在launch.json里加了个定义main名字的属性,算是解决了这个问题
C++端的那个g_quene的问题还是确实存在的。我按我的方法改了就没有问题了
phoenixdown:
断点不好使的问题找到了, 是我为了区分app和h5版本的main.js改了man.js的名字造成的,cocos-debug的cocosFXDebug.js 里main.js的名字是固定的,我在launch.json里加了个定义main名字的属性,算是解决了这个问题
是的,目前只有
main.js
能够唯一定义路径问题。
void ScriptingCore::debugProcessInput(const std::string& str)
JSAutoCompartment ac(_cx, _debugGlobal.ref());
JSString* jsstr = JS_NewStringCopyZ(_cx, str.c_str());
jsval argv = STRING_TO_JSVAL(jsstr);
JS::RootedValue outval(_cx);
JS::RootedObject debugGlobal(_cx, _debugGlobal.ref());
JS_CallFunctionName(_cx, debugGlobal, "processInput", JS::HandleValueArray::fromMarkedLocation(1, &argv), &outval);
static bool NS_ProcessNextEvent()
//g_qMutex.lock();
//size_t size = g_queue.size();
//g_qMutex.unlock();
while (true)
std::string str = "";
g_qMutex.lock();
size_t size = g_queue.size();
if (size > 0)
auto first = g_queue.begin();
str = *first;
g_queue.erase(first);
size = g_queue.size();
g_qMutex.unlock();
if (str.length() > 0)
ScriptingCore::getInstance()->debugProcessInput(str);
if (size <= 0)
break;
// std::this_thread::yield();
std::this_thread::sleep_for(std::chrono::milliseconds(10));
return true;
就这两个函数,你们自己改吧
g_qMutex.lock();
messageCount = g_queue.size(); // if messageCount == 1
if (messageCount > 0)
auto first = g_queue.begin();
message = *first; // get a message
g_queue.erase(first);
–messageCount; // messageCount = 0
g_qMutex.unlock();
if (messageCount == 0) // messageCount is 0 break
break;
if (!message.empty()) // message 还未处理
ScriptingCore::getInstance()->debugProcessInput(message);