可以Qt信号唤醒睡眠线程

时间:2019-05-24 12:28:29

标签: qt signals wakeup

我正在使用Qt框架开发某些应用程序,它使用串行端口并需要接收一些数据,问题是数据是用某种协议组织的,我在readyRead()信号处理程序(插槽)中解析了该协议。同时,我需要等待一些超时的解析消息。因此,为了等待,我在发送后使用了QThread :: msleep(),但是我注意到,当线程在msleep()中进入睡眠状态时,仅在msleep()完成后才会发出readyRead。我的问题是,为什么readyRead无法唤醒线程? Qt信号不能像真正的Unix信号那样工作?

1 个答案:

答案 0 :(得分:1)

如果您的单线程应用程序readyRead插槽未立即执行,则端口上有数据。在Qt::QueuedConnection中了解有关QObject::connect()的信息。当readyRead信号在串行端口类中发出时,它只是添加到事件队列中(在全局事件循环中)。所有事件稍后将由QEventLoop(在QApplication实例内部)执行。

好像您在休眠主线程,因此QEventLoop在休眠时无法执行任何操作。在这种情况下,您需要从另一个线程读取端口,以避免主线程休眠。