任何人都可以帮助我在写入和循环之后读取qprocess的输出,直到所有任务完成? 我有这个代码
wifi->write("scan\n");
wifi->closeWriteChannel();
wifi->waitForBytesWritten(100);
wifi->waitForReadyRead(100);
wifi->waitForFinished(100);
qDebug() << "read output" << wifi->readAllStandardOutput();
wifi->write("scan\n");
wifi->closeWriteChannel();
wifi->waitForBytesWritten(100);
wifi->waitForReadyRead(100);
wifi->waitForFinished(100);
qDebug() << "read output" << wifi->readAllStandardOutput();
预期输出必须是
&#34; OK&#34;
&#34;扫描结果&#34;
但是输出是
&#34; OK&#34;
&#34;&#34;
感谢。
答案 0 :(得分:0)
您的多次等待对任何事情都没有用。所有你关心的是这个过程何时结束,所以只需要一次waitForFinished
次呼叫,超时时间更长(这些扫描不会发生在~100ms内,几秒钟是最好的)。
您不应该使用阻止waitForXxx
方法。他们绊倒每个人,是无休止的悲伤的源泉。忘了他们存在。使用流程信号在事件发生时做出反应。
这是前进的方向。这就是为什么你应该坚持使用现代开发环境,如果可以的话。打字少,易于理解。
void MyObject::startWifi() {
auto process = new QProcess(this);
process->start("program", QStringList() << "argument");
connect(process, &QProcess::started, [process]{
process->write("scan\n");
process->closeWriteChannel();
});
connect(process, &QProcess::finished, [process]{
qDebug() << process->readAllStandardOutput();
process->deleteLater();
});
}
class MyObject : public QObject {
Q_OBJECT
QProcess m_wifi;
Q_SLOT void onStarted() {
m_wifi.write("scan\n");
m_wifi.closeWriteChannel();
}
Q_SLOT void onFinished() {
qDebug() << m_wifi.readAllStandardOutput();
}
public:
MyObject(QObject * parent = 0) : QObject(parent) {
connect(&m_wifi, SIGNAL(started()), SLOT(onStarted()));
connect(&m_wifi, SIGNAL(finished(int,QProcess::ExitStatus)),
SLOT(onFinished()));
}
Q_SLOT void start() {
m_wifi.start("program", QStringList() << "argument");
}
};
然后在该对象的实例上调用start
方法/槽。这就是全部。