【问题标题】:Waiting for QProcess to finish or duration to exceed [duplicate]等待 QProcess 完成或持续时间超过 [重复]
【发布时间】:2013-02-21 08:07:03
【问题描述】:

我正在尝试解决以下情况:

QProcess 应该运行命令并在达到所需的持续时间或命令完成时停止执行它。此 QProcess 由 QThread Worker 启动。

使用这个可以很容易地做到这一点:

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

但也必须有一个暂停洞的功能。 我可以通过 pthread 信号轻松地暂停 QProcess:

kill(task_.pid(), SIGSTOP);

kill(task_.pid(), SIGCONT);

但随后 waitForFinished-duration 继续运行,并在 QProcess 暂停时超过。

有人知道怎么做吗? 当我可以暂停运行 QProcess 和等待命令的孔 QThread 时,等待持续时间也会暂停。但是我怎样才能得到一个 QThread 的 pid 呢? 有没有更好的 Qt 解决方案来暂停 QProcess?

【问题讨论】:

  • 我没有机会仔细检查这一点,但您可以像现在一样暂停它,然后执行task.setProcessState(QProcess::NotRunning) 以指示该进程不再运行。我认为应该停止 waitForFinished,但我不能 100% 确定。
  • 感谢您的提示。不幸的是,它并没有停止 waitForFinished,它仍然用完了。我尝试了另一种现在有效的方法。如果您有兴趣,请参见下文:-)。
  • 奇怪,我原以为状态改变也会停止 waitForFinished。至少你找到了解决办法。

标签: qt pthreads wait qthread qprocess


【解决方案1】:

一个简单的解决方案是自旋锁。 我用一个while循环替换了waitForFinished(desired_duration),每个循环休眠100ms。 此循环的条件是系统时间小于开始时的系统时间,加上所需的持续时间。当 paused_ 变量设置时,100ms 将添加到所需的持续时间,因此它会不断推动测量的时间,但也会推动所需的持续时间。

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;
  }
}

这可能不是一个好的解决方案,但它目前正在工作。

如果有人有其他想法,我很乐意听到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 2017-12-17
    • 2015-04-01
    • 1970-01-01
    • 2020-08-15
    相关资源
    最近更新 更多