QProcess (/ bin/rpm)를 사용하여 RPM을 설치하려고합니다. 이 QProcess는 다른 QThread에 의해 시작된 동시 스레드에서 실행 중입니다.Qthread에서 호출 할 때 QProcess가 종료되지 않습니다.
QThread retThread = new CMyThread(this);
connect(retThread, SIGNAL(finished()), retThread, SLOT(deleteLater()));
retThread->start();
QProcess는 계속 실행 중이며 종료되지 않습니다. QProcess의 PID를 가져 와서 ps 명령을 사용하여 확인하면 실행중인 rpm 명령이 표시되지 않습니다. 표준 출력과 표준 오류는 모두 단일 채널에 병합되고 파일에 로그온됩니다.
로그는 rpm 명령이 설치 프로세스를 완료했음을 나타냅니다.
주 스레드에서 QProcess를 사용하여 rpm 설치를 실행하면 동일한 동작이 표시되지 않습니다. 이것은 이벤트 루프와 관련이 있습니다. 그렇다면 이벤트 루프가 있는지 확인하는 방법. 내 지식에 따라 스레드는 자동으로 QT 4.4 이상의 이벤트 루프를 만들어야합니다. 나는 다른 스레드가이 스레드에서 신호를 대기 얻고 있기 때문에 나는, QT 4.8
http://qt-project.org/wiki/Threads_Events_QObjects
내가 루프가 존재하는 이벤트 같은 느낌을 사용하고 있습니다.
QString ORIGINAL_LOG_FILE = "/var/Component.log";
int PROC_WAIT_TIME= 90000;
QSharedPointer<QProcess> process(new QProcess);
QString program = "/bin/rpm";
QStringList compArgs;
compArgs << "-Uvh"<<"--nodeps"<<"some.rpm";
QStringList configEnvironmentVars = process->systemEnvironment();
process->setEnvironment(configEnvironmentVars);
process->setWorkingDirectory("/tmp/something");
connect(process.data() , SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(slot_finished(int,QProcess::ExitStatus)));
// process->setWorkingDirectory();
process->setProcessChannelMode(QProcess::MergedChannels);
process->setStandardOutputFile(ORIGINAL_LOG_FILE, QIODevice::ReadWrite | QIODevice::Append | QIODevice::Text);
process->start(program, compArgs);
if (process->waitForStarted())
{
LOGINFO(m_nodeLogFile,QString("Waiting for the process to finish"));
do
{
LOGINFO(m_nodeLogFile, QString("pid = %1").arg((uint)process->pid()));
LOGINFO(m_nodeLogFile , QString("Error = %1").arg(process->error()));
LOGINFO(m_nodeLogFile,QString("Envirnoment variables = %1").arg(configEnvironmentVars.join("\n")));
LOGINFO(m_nodeLogFile,QString("Working directory = %1").arg(process->workingDirectory()));
LOGINFO(m_nodeLogFile,QString("State = %1").arg(process->state()));
}while(!process->waitForFinished(100));
심지어 마무리 신호에 연결하려고했습니다.