2017-09-14 101 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); 
}