wxWidgets wxThread删除可连接线程

时间:2011-04-24 20:23:43

标签: c++ multithreading wxwidgets

我在wxWidgets中遇到了关于可连接线程的问题。

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

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

提前致谢,

TIBO

3 个答案:

答案 0 :(得分:1)

您必须从工作线程调用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;
}

希望它有所帮助。

P.S。 :这是我在Stack Overflow上的第一个答案。我不知道怎么能自动写一些自动缩进的代码?

答案 1 :(得分:0)

您不必重写代码。

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

实现这一目标的一种方法,也许是最简单的方法是抛出一些将在主线程函数中捕获的对象。

例如:

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

答案 2 :(得分:0)

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

  

此函数适用于可连接线程,但在这种情况下,使线程的TestDestroy()函数返回true,然后等待其完成(即它与Wait()不同,因为它要求线程在等待之前终止)。

因此,您似乎可以在可连接线程上使用Delete()