线程中断与插槽和信号

QThreads interruption with slots and signals

本文关键字:信号 插槽 中断 线程      更新时间:2023-10-16

我有一个包含QThread的类。在这个类的初始化函数中,线程应该被启动。这是正确的。在线程中,我有一个while(bool certainCondition){},这个certainCondition应该通过信号/插槽连接来改变。

问题是在运行过程中信号/插槽没有打开。

您没有在线程中运行事件循环,或者在while循环中阻塞了很长时间。在您将控制返回给事件循环之前,您的slot不能被调用,这将在完成while循环之后发生。

作为一种解决方法,你可以尝试在while循环中调用QCoreApplication::processEvents()。

为了让信号/插槽跨线程工作,必须运行事件循环。
如果使用while循环,则事件循环永远不会运行,因此不会接收到信号。
事件循环通常是这样运行的:

void Thread::run()
{
    ...do something
    exec();  //<<this runs the event loop
}

现在,您的问题是,您希望连续运行一些代码,直到满足某些条件。在上面的代码中,由于exec()调用,这不起作用。
有两种可能来解决这个问题(取决于你想在循环中实现什么):

  1. 使用QTimer,假设每5秒触发一次,并调用一个插槽来执行重复代码。

  2. 使用QWaitCondition检查某个条件是否满足;但是你不能使用信号和插槽;而必须触发QWaitCondition