2017-09-14 35 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 = 새로운 QProcess (this); QObject :: connect (usbProcess, & QProcess :: readyReadStandardOutput, [this]() { text = usbProcess-> readAllStandardOutput(); text.replace (",", ", \ n"); text.replace ":", "\ n :"); qDebug() << __ LINE __ << __ PRETTY_FUNCTION __ << text; }); QObject :: connect (usbProcess, SIGNAL (finished (int)), this, 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); 
}