Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt信号能否唤醒休眠线程_Qt_Signals_Wakeup - Fatal编程技术网

Qt信号能否唤醒休眠线程

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

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

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


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

为什么要睡眠?如果您使用QThread来管理线程,那么它有自己的事件循环,在收到信号之前不会执行任何操作。您不需要手动休眠,QThread的事件循环将自动为您执行此操作。跨线程信号由接收线程的事件循环处理,sleep()会阻止该循环。没有办法用Qt信号中断阻塞调用。