如何在Qt中的主线程和工作线程之间进行同步?

时间:2009-04-20 13:33:56

标签: c++ multithreading qt synchronization

我有这个设计。我无法实现我的需求:

  • B继承自A。
  • A继承自QThread。

我的目标是在完成任务后重启(重新运行)到“worker”线程。我打算为这种方法调用工作线程析构函数,因为它从堆中获取内存。我需要清理所有相关变量。

我怎样才能做到这一点?

int main()
{
   // re-start start
    A* worker = B::getInstance();  
    worker->start();
   // re-start end

    return a.exec();
}

编写for循环不是解决方案。因为,我需要学习工作线程完全停止。我尝试使用worker-> wait()。但它不起作用。

3 个答案:

答案 0 :(得分:2)

如何使用QThread的信号finished()

答案 1 :(得分:0)

我不完全理解您的问题,但是如果您分配了线程并且必须在完成后重新启动它,您可以执行以下操作:

检查:

  • 在工作线程完成时设置一个变量,让主线程轮询该变量进行设置。发生这种情况时,表示线程已完成。
  • 或者,让您的工作线程调用postEvent(),以便将用户定义的事件发布到事件队列中。然后,主线程将收集此事件,并采取相应的行动。

重启:

  • 要么完全丢弃工作线程对象并创建一个新的
  • 或者在调用的private cleanup()方法中使用清理代码:
    • 你运行线程(它做的第一件事)
    • 析构函数中的
    • 将其公开并手动使用,如果你想授予这种可能性(危险,如果在线程运行时调用)

答案 2 :(得分:0)

RAII(资源获取是初始化)中的一般规则是获取资源的代码负责确保它被释放。因此,您的工作线程应在释放它已获取的所有资源后终止。

主程序的一般风格是:

  • 初始化需要初始化的内容
  • 在“永远”循环中,
  • 初始化工作线程。
  • 让它免费运行。
  • 主线程可以执行委托工作(将任务交给工作人员)
  • 或者只是等待工人完成
  • 然后重复。

或者,主线程仍然可以在永久循环中运行,但是当可委托任务到达时识别,并在那时初始化工作线程并为其指定特定任务。这允许与不完整的可委托任务一样多的工作线程。您可能需要限制数量,以便没有太多不完整的任务。