【问题标题】:wxWidgets wxThread Delete for a Joinable ThreadwxWidgets wxThread 删除可连接线程
【发布时间】:2011-04-24 20:23:42
【问题描述】:

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

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

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

提前致谢,

蒂博

【问题讨论】:

    标签: c++ multithreading wxwidgets


    【解决方案1】:

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

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

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

    【讨论】:

    • 哦,是的。只是最新的稳定文档说你不应该在可连接的文档上这样做:(
    • 文档说不要使用删除操作符,即。 delete m_thread 但您始终可以使用 m_thread->delete()
    【解决方案2】:

    你必须从你的工作线程调用 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 上的第一个答案。不知道怎么才能轻松写出一些自动缩进的代码?

    【讨论】:

    • 我相信在可连接线程上调用Delete() 会导致它等到线程退出,因此您不需要stopThread() 中的Delete() 之后的Wait()Wait() 可能只是优雅地返回,但它是多余的,虽然我没有测试你的代码。
    • 不,它会告诉线程删除。唯一的事情是TestDestroy() 将返回true,那么线程应该Exit()。稍后您必须从调用线程调用 Wait() (以释放“它使用的系统资源”),然后您可以删除运行该线程的对象。
    【解决方案3】:

    您不必重写代码。

    按照文档的建议,线程通常最好通过从它的主函数返回来终止。

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

    例如:

    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()-flag”。似乎只能使用 Delete(),但正如纪录片所说,可连接线程不应该使用它......
    猜你喜欢
    • 2014-02-25
    • 2012-12-16
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 2011-04-14
    • 2014-10-31
    相关资源
    最近更新 更多