QProcess не завершает создание файла - PullRequest
1 голос
/ 31 марта 2012

Я просто пытаюсь создать файл с QProcess, используя следующий исходный код:

void Processmethod()
{

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

    processmethodONE(); 
} 

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

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

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

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

Этот процесс создает из другого файла, который находится в QString «Path», новый файл, позвольте мне назвать его «PROFILE» (PRO для Problem :). Профиль также создается, но никогда не завершается, я думаю, даже 50% файла не завершены. Просто при использовании

while(!Prozess.waitForFinished())
      {
       qApp->processEvents();
       std::cerr << "Process Create PROFile running " << std::endl;
      }

файл написан полностью. Кроме того, я попытался использовать сигнал QProcess finish (int) для запуска другого метода и удалил цикл while (который останавливает весь графический интерфейс). Я объявил это в конструкторе с:

connect(&Prozess, SIGNAL(finished(int)), this, (SLOT(processmethodTWO())));

Но я думаю, это не могло сработать, потому что первый процесс не завершен полностью. Где проблема?

1 Ответ

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

Нет гарантии, что сразу после Prozess.start(ProcessCommand); процесс будет завершен, поэтому вызывается "Prozess.exitStatus ();"Сразу после этого вы получите «ложное срабатывание».Вам наверняка придется подождать, пока процесс не закончится.Вы можете сделать это либо с помощью цикла while, который вы предложили, либо с помощью QEventLoop

// ...
Prozess.setStandardOutputFile(Path);       //in my class
QEventLoop loop;
connect(&Prozess, SIGNAL(error(QProcess::ProcessError)), &loop, SLOT(quit()));
connect(&Prozess, SIGNAL(finished(int, QProcess::ExitStatus)), &loop, SLOT(quit()));
Prozess.start();
loop.exec();
// Now your process status should be valid:
QProcess::ExitStatus Status = Prozess.exitStatus();
...