Как использовать процесс (QProcess) в новом потоке (QThread)? - PullRequest
2 голосов
/ 25 марта 2012

У меня есть следующий код:

 void Processmethod()
{

    QDialog *ProcessMessage = new QDialog;      
    Ui::DialogProcessMessage Dialog;            
    Dialog.setupUi(ProcessMessage);             
    ProcessMessage->setModal(true);
    ProcessMessage->setAttribute(Qt::WA_DeleteOnClose); 
    ProcessMessage->show();

    qApp->processEvents();

    processmethodONE();  
    processmethodTWO();
    processmethodTHREE();                  
}

void processmethodONE()
{
    QString ProcessCommand = "w8 " + blablubli";            

    Prozess.setWorkingDirectory(Path);         //QProcess "Prozess" is globaly defined  
    Prozess.setStandardOutputFile(Path);       //in my class

    QThread* thread = new QThread;
    Prozess.moveToThread(thread);
    Prozess.start(ProcessCommand);


while(!Prozess.waitForFinished(2000))
   {
       std::cerr << "Process running " << std::endl;
   }

QProcess::ExitStatus Status = Prozess.exitStatus(); 

if (Status == 0)
 {
   std::cout << "File created!" << std::endl;
 }
}

В этом исходном коде я пытаюсь открыть всплывающее диалоговое окно перед запуском некоторых процессов. Проблема в том, что в диалоге нельзя нажать, но в диалоговом окне я хочу создать кнопку, чтобы прервать запущенный метод. Как вы можете видеть, я пытался использовать QThread для запуска процесса (ов) в другом потоке, но все равно не могу щелкнуть диалоговое окно. Более того, если я открою свое приложение (GUI) с файлом «application / x-исполняемый», содержимое диалогов отсутствует при активации показанного выше метода. Как я могу исправить эти проблемы? Где я не прав? привет

Ответы [ 2 ]

3 голосов
/ 25 марта 2012
void processmethodONE()
{
   QThread* thread = new QThread;
   Prozess.moveToThread(thread);
   Prozess.start(ProcessComand);

Здесь вы переместили QProcess в другой поток. Но затем вы вызываете start () для этого. Это уже не потокобезопасно.

while(!Prozess.waitForFinished(2000))
{
   std::cerr << "Process running " << std::endl;
}

Это блокирует и делает использование потока бесполезным. Кроме того, это не потокобезопасно.

Вместо этого вы не должны использовать темы, но:

  1. убрать вызов waitForFinished ()
  2. Подключите сигналы завершения () и ошибки () QProcess к слотам, которые затем начинают следующий шаг, т.е. processMethodTWO.

Я бы также советовал не использовать объекты QProcess повторно и просто создавать новые для каждого шага.

2 голосов
/ 25 марта 2012

Хотя я все еще не до конца понимаю ваш недавно обновленный пример кода, я чувствую, что это может быть вашей проблемой:

while(!Prozess.waitForFinished(2000))
   {
       std::cerr << "Process running " << std::endl;
   }

Везде, где вы на самом деле вызываете это в исходном коде, блокируется в ожидании завершения Prozess.

Используйте новый экземпляр QProcess для каждого и подключите их сигналы finish () к слоту, который будет вызван после их завершения. Не опрашивайте их вручную и не блокируйте. Это позволит вам полностью избавиться от QThreads.

...