我们有一个用C ++编写的庞大,复杂的wxWidgets应用程序。我添加了一个额外的后台线程。当用户单击“go”时,线程启动。当他们点击“停止”时,线程停止。由于我无法理解的原因,单击“停止”也会导致显示以下消息:
Can not wait for thread termination (error 6: the handle is invalid.)
Couldn't terminate thread (error 6: the handle is invalid.)
为什么会发生这种情况?更重要的是,我如何让它立即消失?
线程在这里开始:
_worker = new WorkerThread();
_worker->Create();
_worker->Run();
我知道线程正在运行,因为我可以看到它正在编写的磁盘文件。
线程在这里停止:
if (_worker)
{
_worker->Delete();
_worker = NULL;
}
WorkerThread
课程仅覆盖Enter()
。 绝对是一个可拆卸的线程。
文档中充满了关于可分离线程如何随时删除自身的可怕警告,并且所有内容必须始终包含在关键部分中。但我的工作线程永远运行,直到我告诉它停止。我不明白为什么我需要任何关键部分。
线程停留的时间太长了吗? 那问题? (它每秒只检查TestDestroy()
一次。这太慢了吗?)
我真的无法弄清楚怎么解决这个问题。
答案 0 :(得分:0)
使用wxLogNull,可能“让它消失”,就像wxWidgets生成的任何其他消息一样。你应该不这样做,因为你似乎在你的代码中某处有一个真正的bug,线程句柄显然不应该是无效的,如果是,那么显然不会像你认为的那样。通过在地毯下扫除错误,您可以保证它会在最糟糕的时刻以不同的形式再次出现,并且通常在您将无法调试它的客户机上。现在真的好了。