C++ wxWidgets wxThread可连接线程的删除

C++ wxWidgets wxThread可连接线程的删除,c++,multithreading,wxwidgets,C++,Multithreading,Wxwidgets,我有一个关于wxWidgets中可连接线程的问题 当用户需要它时,我想停止一个线程做一些工作。因此,我调用这个工作线程TestDestroy()来检查该线程是否应该停止。但是我只能通过调用Delete()来停止线程,对于可连接的线程不应该调用Delete() 我是否有可能停止线程(使用TestDestroy)或者必须完全更改代码 提前感谢, TiBo您不应该重写代码 正如文档所示,通常最好是线程通过从其主函数返回来终止 实现这一点的一种方法,可能是最简单的方法,就是抛出一些将在主线程函数中捕获的

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

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

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

提前感谢,


TiBo

您不应该重写代码

正如文档所示,通常最好是线程通过从其主函数返回来终止

实现这一点的一种方法,可能是最简单的方法,就是抛出一些将在主线程函数中捕获的对象

例如:

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.
    }
}

当前的文档说明:

此函数适用于可接合线程,但在这种情况下,会使线程的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;
}
希望它能有所帮助


这是我关于堆栈溢出的第一个答案。我不知道如何轻松地编写一些自动缩进的代码?

谢谢您的回答;但我遇到的问题是,我不知道如何设置“TestDestroy()-标志”。似乎只可能使用Delete(),但正如纪录片中所说,可连接线程不应该使用Delete()。。我相信在可连接线程上调用
Delete()
会导致它等待线程退出,因此在
stopThread()
中的
Delete()
之后不需要
wait()
Wait()
可能只是优雅地返回,但它是多余的,尽管我没有测试您的代码。不,它会告诉线程删除。唯一的问题是TestDestroy()将返回true,然后线程应该退出()。稍后,您必须从调用线程调用Wait()(以释放“它使用的系统资源”),然后您可以删除运行该线程的对象。哦,是的。。只是最新的稳定文档说,您不应该在可连接的线程上执行此操作:(文档中说不要使用delete操作符,即
delete m_-thread
,但您始终可以使用
m_-thread->delete()