【问题标题】:Couldn't terminate thread (error 6)无法终止线程(错误 6)
【发布时间】:2014-03-05 16:01:09
【问题描述】:

我们有一个用 C++ 编写的庞大而复杂的 wxWidgets 应用程序。我添加了一个额外的后台线程。当用户单击“开始”时,线程启动。当他们单击“停止”时,线程停止。由于我无法理解的原因,单击“停止”会导致显示以下消息:

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()。它绝对是一个可拆卸的线程。

文档中充满了关于可分离线程如何随时删除自身的可怕警告,并且所有内容都必须始终包含在关键部分中。但是 my 工作线程永远运行,直到我告诉它停止。我不明白为什么我需要一个关键部分。

线程是否需要太长时间才能停止? 有问题吗? (它每秒只检查一次TestDestroy()。是不是太慢了?)

我真的不知道如何解决这个问题。

【问题讨论】:

    标签: c++ windows multithreading wxwidgets


    【解决方案1】:

    可以使用wxLogNull“让它消失”,就像使用 wxWidgets 生成的任何其他消息一样。您应该这样做,但是因为您的代码中似乎有一个真正的错误,线程句柄显然不应该是无效的,如果是,那么显然有些事情不会像您想象的那样.通过将错误扫到地毯下,您几乎可以保证它会在最坏的时刻以不同的形式重新出现,并且通常会出现在您无法调试它的客户端机器上。最好现在就去做。

    【讨论】:

    • 我基本上同意这个消息中的所有内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    相关资源
    最近更新 更多