QProcess中多次写入的输出一一读取
Posted
技术标签:
【中文标题】QProcess中多次写入的输出一一读取【英文标题】:Read output of multiple write in QProcess one by one 【发布时间】:2014-03-28 06:01:06 【问题描述】:谁能帮我在写入和循环之后读取 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();
预期的输出必须是 “好的” “扫描结果”
但输出是 “好的” ""
谢谢。
【问题讨论】:
【参考方案1】:您的多次等待对任何事情都没有用。您只关心进程何时完成,因此有一个具有更长超时时间的 waitForFinished
调用(这些扫描不会在大约 100 毫秒内发生,最少几秒钟)。
您不应该使用阻塞的waitForXxx
方法。他们绊倒了每个人,是无休止的悲伤之源。忘记它们的存在。使用进程的信号对发生的事件做出反应。
Qt 5 + C++11
这是前进的方向。这就是为什么你应该坚持使用现代开发环境,如果可以的话。输入更少,更容易理解。
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();
);
Qt 4
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
方法/槽。就是这样。
【讨论】:
我的问题是我第二次使用 wifi->readAllStandardOutput();在 wifi->write("command");输出是“”以上是关于QProcess中多次写入的输出一一读取的主要内容,如果未能解决你的问题,请参考以下文章