Qt信号能否唤醒休眠线程
我正在使用Qt框架开发一些应用程序,它使用串行端口,需要接收一些数据,问题是数据是用某种协议组织的,我在readyRead()信号处理程序(插槽)中解析这些协议,同时,我需要等待解析的消息并超时。所以,为了等待,我在发送后使用了QThread::msleep(),但我注意到,当线程在msleep()中进入睡眠状态时,readyRead将仅在msleep()完成后才会发出。我的问题是,为什么readyRead不能唤醒线程?Qt信号不像真正的Unix信号那样工作?如果您有单线程应用程序Qt信号能否唤醒休眠线程,qt,signals,wakeup,Qt,Signals,Wakeup,我正在使用Qt框架开发一些应用程序,它使用串行端口,需要接收一些数据,问题是数据是用某种协议组织的,我在readyRead()信号处理程序(插槽)中解析这些协议,同时,我需要等待解析的消息并超时。所以,为了等待,我在发送后使用了QThread::msleep(),但我注意到,当线程在msleep()中进入睡眠状态时,readyRead将仅在msleep()完成后才会发出。我的问题是,为什么readyRead不能唤醒线程?Qt信号不像真正的Unix信号那样工作?如果您有单线程应用程序readyRe
readyRead
插槽,则不会立即执行,端口上会有数据。阅读QObject::connect()
中的Qt::QueuedConnection
。当readyRead
信号在串行端口类中发出时,它只是添加到事件队列中(在全局事件循环中)。所有事件稍后将由QEventLoop
(在QApplication实例内)执行
看起来您正在休眠主线程,因此
QEventLoop
无法在休眠时执行任何操作。在这种情况下,您需要从另一个线程读取端口以避免主线程睡眠。为什么要睡眠?如果您使用QThread来管理线程,那么它有自己的事件循环,在收到信号之前不会执行任何操作。您不需要手动休眠,QThread的事件循环将自动为您执行此操作。跨线程信号由接收线程的事件循环处理,sleep()会阻止该循环。没有办法用Qt信号中断阻塞调用。