QProcess冻结GUI
问题描述:
这是QNX目标的代码片段。当我在系统上运行它时,以及当我执行下一个点火周期/重新启动系统时,它会正常工作,GUI会冻结/挂起。QProcess冻结GUI
如果可能,请告诉我这段代码有什么问题。
我试过readAllStandardOutput
,并且完成并启动了同样问题的信号。它没有帮助。
qCDebug(SYSTEM)<<"--RDQA--"<<__LINE__<<__PRETTY_FUNCTION__<<!usbProcess;
usbProcess = new QProcess();
qCDebug(SYSTEM)<<"--RDQA--"<<__LINE__<<usbProcess->pid();
usbProcess->start("usb");
qCDebug(SYSTEM)<<"--RDQA--"<<__LINE__<<usbProcess->pid();;
usbProcess->waitForReadyRead();
qCDebug(SYSTEM)<<"--RDQA--"<<__LINE__;
usbProcess->waitForFinished();
qCDebug(SYSTEM)<<"--RDQA--"<<__LINE__;
text = usbProcess->readAll();
qCDebug(SYSTEM)<<"--RDQA--"<<__LINE__<<!usbProcess<<text;
usbProcess->closeReadChannel(QProcess::ProcessChannel::StandardOutput);
usbProcess->closeReadChannel(QProcess::ProcessChannel::StandardError);
usbProcess->closeWriteChannel();
usbProcess->close();
delete usbProcess;
qCDebug(SYSTEM)<<"--RDQA--"<<__LINE__<<!usbProcess;
答
您正在GUI线程上运行阻塞过程。这就是你的GUI挂起的原因。
我通常会创建两种方法。一个是阻止和一个是非阻塞。 阻止方法被调用using the Qt Concurrent framework由非阻塞方法。完成时发出信号并返回任何数据。
// Runs the usb process without blocking
void MyClass::runUsbProcess(){
QtConcurrent::run(this, &MyClass::runUsbProcessBlocking);
}
// Runs the usb process while blocking
void MyClass::runUsbProcessBlocking(){
qCDebug(SYSTEM)<<"--RDQA--"<<__LINE__<<__PRETTY_FUNCTION__<<!usbProcess;
usbProcess = new QProcess();
qCDebug(SYSTEM)<<"--RDQA--"<<__LINE__<<usbProcess->pid();
usbProcess->start("usb");
qCDebug(SYSTEM)<<"--RDQA--"<<__LINE__<<usbProcess->pid();;
usbProcess->waitForReadyRead();
qCDebug(SYSTEM)<<"--RDQA--"<<__LINE__;
usbProcess->waitForFinished();
qCDebug(SYSTEM)<<"--RDQA--"<<__LINE__;
text = usbProcess->readAll();
qCDebug(SYSTEM)<<"--RDQA--"<<__LINE__<<!usbProcess<<text;
usbProcess->closeReadChannel(QProcess::ProcessChannel::StandardOutput);
usbProcess->closeReadChannel(QProcess::ProcessChannel::StandardError);
usbProcess->closeWriteChannel();
usbProcess->close();
delete usbProcess;
qCDebug(SYSTEM)<<"--RDQA--"<<__LINE__<<!usbProcess;
emit usbProcessFinished(text);
}
我不知道我完全理解这个问题,但是......如果你检查[QProcess文档](http://doc.qt.io/qt-5/qprocess.html),那么' waitForReadyRead'和'waitForFinished'带有警告“从主(GUI)线程调用此函数可能会导致您的用户界面冻结”。改用信号/插槽。 –
我试过了。请看看... – csearun89
usbProcess = new QProcess(this); qObject :: connect(usbProcess,&QProcess :: readyReadStandardOutput,[this](){ text = usbProcess-> readAllStandardOutput(); text.replace(“,”,“,\ n”); text.replace “:”,“\ n:”); qDebug() start(“usb”); – csearun89