2017-09-14 3 views
0

これは、QNXターゲットのコードスニペットです。私はシステムでそれを実行し、私は次の点火サイクル/私のシステムを再起動するとき、それは正常に動作し、GUIはフリーズ/ハングです。QProcess freeze 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 documentation](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 __ <<テキスト; }); QObject :: connect(usbProcess、SIGNAL(finished(int))、this、SLOT(finished(int))); usbProcess-> start( "usb"); – csearun89

答えて

0

ブロック処理はGUIスレッドで実行しています。だからあなたのGUIがぶら下がっているのです。

私は通常、2つの方法を作成します。 1つはブロッキングであり、1つはノンブロッキングです。 ブロッキングメソッドは、ノンブロッキングメソッドによって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); 
}