QProcess freeze GUI

QProcess freeze GUI

本文关键字:GUI freeze QProcess      更新时间:2023-10-16

这是QNX目标的代码段。当我在系统上运行它时,它可以正常工作,当我进行下一个点火周期/重新启动系统时,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悬挂。

我通常创建两种方法。一个是阻止的,一个是非阻滞阻止方法是使用 nonblocking 方法使用QT并发框架调用的。完成后发出信号并返回任何数据。

// 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);
}