我有一个调用C ++代码的插件。当游戏开始时,它会调用extern
C ++函数:
void startPlugin() {
MyClass::instance = new MyClass();
MyClass::instance->process();
}
process
方法运行一个无限循环来处理数据并继续,只要keepRunning
成员为真。因为它运行无限循环和块,所以在自己的线程中调用此方法。
当游戏结束时,我从C#运行这个extern
方法:
void stopPlugin() {
MyClass::instance->keepRunning = false;
sleep(1); // Make sure the process loop is done. It should take less than one frame, but just to be sure...
MyClass::cleanup();
}
这是指这种方法:
void MyClass::cleanup() {
delete instance;
instance = NULL;
}
根据控制台的说法,这些方法确实已经运行。
在Mac上,这是第一次使用。我可以在编辑器中启动游戏并在编辑器中停止它,一切正常。但是,如果我尝试再次运行它而不重新启动Unity编辑器,则整个编辑器会冻结。有时它需要三次而不是两次,但总是第二次或第三次尝试完全冻结Unity。光标变为旋转风车轮。
日志说:
Starting.
(Filename: /Applications/buildAgent/work/d63dfc6385190b60/artifacts/MacEditorGenerated/UnityEngineDebug.cpp Line: 49)
Receiving unhandled NULL exception
Launching bug reporter
Obtained 37 stack frames.
#0 0x00000090019390 in _platform_memmove$VARIANT$sse42
然后堆栈跟踪调出调用extern
函数的函数。
尝试加入正在运行的线程startPlugin
冻结编辑器停止。我认为不应该这样做。毕竟,在那个阶段,循环结束并清理实例。这不是猜测,有明显的副作用:结束循环关闭计算机的相机,我可以看到相机的光线熄灭。调用startPlugin
后,还会在C#中发送调试消息。所以毫无疑问,循环结束了。
每次在Windows上都不会删除该实例的先前版本。
我做错了什么?
答案 0 :(得分:1)
我找到了答案。
即使在C ++中没有调用任何线程,我仍然需要在pthread_exit(this)
方法的末尾调用process
。这在Windows上不是必需的,但它在Mac上。之后,一切正常。