Ожидание завершения QProcess или превышение продолжительности

Пытаюсь найти выход из следующей ситуации:

QProcess должен запускать команду и прекращать ее выполнение, когда достигнута желаемая продолжительность или команда завершена. Этот QProcess запускается рабочим процессом QThread.

Это можно легко сделать, используя это:

QProcess task("executedTool -parameters");
task.start();
task.waitForFinished(desired_max_duration_in_ms);

Но также должна быть функция приостановки работы с дыркой. Я могу легко приостановить QProcess с помощью сигналов pthread:

kill(task_.pid(), SIGSTOP);

и

kill(task_.pid(), SIGCONT);

Но затем длительность waitForFinished продолжает работать и превышается, пока QProcess приостановлен.

Кто-нибудь знает, как это сделать? Когда я мог бы приостановить дырочный QThread, который запускает QProcess и команду ожидания, продолжительность ожидания также была бы приостановлена. Но как я могу получить pid QThread? Есть ли лучшее решение Qt для приостановки QProcess?


person Josch    schedule 21.02.2013    source источник
comment
У меня не было возможности перепроверить это, но вы можете приостановить его, как и вы, а затем выполнить task.setProcessState(QProcess::NotRunning), чтобы указать, что процесс больше не выполняется. Я думаю, что это должно остановить waitForFinished, но я не уверен в этом на 100%.   -  person Nicholas Smith    schedule 21.02.2013
comment
Спасибо за подсказку. К сожалению, это не останавливает waitForFinished, оно все еще заканчивается. Я попробовал другой метод, который работает сейчас. Смотрите ниже, если вам интересно :-).   -  person Josch    schedule 21.02.2013
comment
Странно, я бы подумал, что изменение состояния также остановит waitForFinished. По крайней мере, вы нашли решение.   -  person Nicholas Smith    schedule 21.02.2013


Ответы (1)


Легким и простым решением являются Spinlocks. Я заменил waitForFinished(desired_duration) циклом while, спящим по 100 мс каждый цикл. Условием для этого цикла является то, что системное время меньше, чем системное время в начале плюс желаемая продолжительность. Когда переменная paused_ установлена, 100 мс будут добавлены к желаемой продолжительности, поэтому она продолжает увеличивать измеренное время, а также желаемую продолжительность.

qint64 ms_start = QDateTime::currentMSecsSinceEpoch();
qint64 ms_end = ms_start + (bag_list_->at(i)->getDuration() * 1000) + 1500;

while (QDateTime::currentMSecsSinceEpoch() < ms_end && worker_thread_->isRunning())
{
  SleepThread::msleep(100);
  if (paused_)
  {
    qDebug() << "add 100";
    ms_end += 100;
  }
}

Это, вероятно, не очень хорошее решение, но на данный момент оно работает.

Если у кого-то есть другие идеи, буду рад их услышать.

person Josch    schedule 21.02.2013