我的代码如何在Qt Eventloop开始之前接收信号
How is my code Receiving Signals before the Qt Eventloop is Started
我试图理解为什么在以下Qt 4.8代码中放置a.exec()调用不需要在我的QProcess waitForFinished()和waitForStarted()调用可以工作之前发生。我理解a.exec()启动事件循环,在我看来,waitFor*槽需要接收一个信号(即'started()'或'finished()'),然后再继续执行。如果事件循环没有启动,怎么会发生这种情况呢?
waitForStarted()的文档:
Blocks until the process has started and the started() signal has been emitted, or until msecs milliseconds have passed.
代码:int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// Exec the i2c command to get the power button status
QProcess i2cprocess;
i2cprocess.start("/usr/bin/i2cget -f -y 1 0x4b 0x45");
// Wait for it to start
if(!i2cprocess.waitForStarted())
{
qDebug() << "Could not start QProcess to check power button status.";
exit(-1);
}
// Wait for it to finish
bool returnValue = i2cprocess.waitForFinished();
if ( returnValue )
{
QByteArray status = i2cprocess.readAllStandardOutput().trimmed();
bool ok;
quint16 hexValue = status.toUInt(&ok, 16);
qDebug() << "Power button status: " << status << hexValue << (hexValue & 0x01);
// We want LSB
exit(hexValue & 0x01);
}
else
{
qDebug() << "Error, process never completed to check power button status.";
exit(-1);
}
return a.exec();
}
直接信号槽连接只是间接的函数调用,它们与事件循环没有任何关系。
但是,waitForXxxx
方法所做的是旋转本地事件循环,直到信号触发。这个信号是由一些代码发出的,操作系统会通知这些代码进程状态发生了变化。该代码在功能上由事件循环"执行"。
记住,在Qt中你可以随心所欲地创建临时事件循环——这是一个不好的做法,你不应该编写使用waitFor
方法的代码。它对代码提出了通常不存在的需求——从而引入了bug !
QProcess的Qt文档说明:-
QProcess提供了一组函数,通过挂起调用线程,直到发出某些信号,这些函数允许在没有事件循环的情况下使用它:
waitForStarted()阻塞,直到进程启动。
waitForReadyRead()阻塞,直到当前读通道上有新的数据可用。
waitForBytesWritten()阻塞,直到一个有效负载的数据被写入到进程。
waitForFinished()阻塞,直到进程完成。
从主线程(调用QApplication::exec()的线程)调用这些函数可能会导致用户界面冻结。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- Qt VTK交互风格的信号到小部件
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 线程之间的布尔停止信号
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 当用户在qtablewidget中输入单元格时,如何获得信号?C++
- 有可能在信号处理程序中设置promise吗
- 根据用户输入用字母填充矢量,并将"开始"和"结束"放在四肢
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- 在条件变量中触发错误信号的频率是多少
- 如何从头开始创建 avi 文件?
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 自一周开始以来的秒数?
- 一旦双簧管录制开始,主 UI 线程就会被阻止
- 多线程.如果我使用信号量,我可以在开始时创建很多线程还是应该只有几个线程?
- 我如何接收到QNAM开始在Qt中下载网页的信号?
- 如何从一个信号中找出进程的pid是在linux中的c++中开始的
- 我的代码如何在Qt Eventloop开始之前接收信号