繁体   English   中英

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

[英]How to synchronize between main and worker thread in Qt?

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

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

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

我怎样才能做到这一点?

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

    return a.exec();
}

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

如何使用QThread的信号finished()

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

去检查:

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

重启:

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

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

主程序的一般风格将是:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM