我的C ++ Unity插件在编辑器中运行一次但不是两次

时间:2014-12-30 03:18:40

标签: c++ multithreading unity3d pinvoke

我有一个调用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上都不会删除该实例的先前版本。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

我找到了答案。

即使在C ++中没有调用任何线程,我仍然需要在pthread_exit(this)方法的末尾调用process。这在Windows上不是必需的,但它在Mac上。之后,一切正常。