wxWidgets wxThread删除可连接线程

wxWidgets wxThread Delete for a Joinable Thread

本文关键字:线程 可连接 删除 wxThread wxWidgets      更新时间:2023-10-16

我有一个关于wxWidgets中可连接线程的问题。

当用户需要它时,我想停止一个线程做一些工作。出于这个原因,我在这个工作线程中调用TestDestroy()来检查线程是否应该停止。但是我只能通过调用Delete()来停止线程,对于可接合的线程,不应该调用Delete()。

是否有可能让我停止线程(使用TestDestroy),或者我必须完全改变我的代码?

提前感谢,

提伯

wxThread::Delete()的当前文档说:

这个函数在一个可连接的线程上工作,但是在这种情况下,线程的TestDestroy()函数返回true,然后等待它的完成(也就是说,它不同于Wait(),因为它在等待之前要求线程终止)。

所以,看起来你可以在可接合的线程上使用Delete()

你必须从你的工作线程调用Exit()方法,或者简单地从Run方法返回并调用MyThread->Wait()方法,然后删除线程对象。

声明线程:

class MyThread : public wxThread {
  virtual void * run();
};

线程实现:

MyThread::run()
{
  while(1)
  {
    if(TestDestroy())
    {
        this.Exit();  // or return;
    }
    // Do some work
  }
}

声明线程指针:

MyThread * pMyThread;

创建、启动和停止线程

void launchThread{
  pMyThread = new wxThread(wxTHREAD_JOINABLE);
  pMyThread->Create();
  pMyThread->Run();
}
void stopThread(){
  pMyThread->Delete();
  pMyThread->Wait();
  delete pMyThread;
}

希望对你有帮助。

注:这是我在Stack Overflow上的第一个答案。我不知道如何编写自动缩进的代码?

你不应该重写你的代码。

正如文档所建议的那样,线程终止时最好从它的主函数返回。

实现这一点的一种方法,可能是最简单的,是抛出一些对象,这些对象将被主线程函数捕获。 例如:

struct ThreadEndingException { };
void DoSomeWork() {
    ...
    if (TestDestroy())
        throw ThreadEndingException();
    ...
}
void ThreadFunction() {
    try {
        DoSomeWork();
    }
    catch (const ThreadEndingException&) {
        // Do nothing, the function will return after leaving this catch.
    }
}