2017-09-14 141 views
0

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

我不知道我完全理解这个问题,但是......如果你检查[QProcess文档](http://doc.qt.io/qt-5/qprocess.html),那么' waitForReadyRead'和'waitForFinished'带有警告“从主(GUI)线程调用此函数可能会导致您的用户界面冻结”。改用信号/插槽。 –

+0

我试过了。请看看... – csearun89

+0

usbProcess = new QProcess(this); qObject :: connect(usbProcess,&QProcess :: readyReadStandardOutput,[this](){ text = usbProcess-> readAllStandardOutput(); text.replace(“,”,“,\ n”); text.replace “:”,“\ n:”); qDebug()<< __ LINE __ << __ PRETTY_FUNCTION __ << text; }); (完成(int)),这个,SLOT(finished(int))); usbProcess-> start(“usb”); – csearun89

回答

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