QProcess冻结GUI

时间:2017-09-14 06:53:10

标签: c++ qt qprocess

这是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;

1 个答案:

答案 0 :(得分:0)

您正在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);
}