等待 QProcess 完成或持续时间超过 [重复]

Posted

技术标签:

【中文标题】等待 QProcess 完成或持续时间超过 [重复]【英文标题】:Waiting for QProcess to finish or duration to exceed [duplicate] 【发布时间】: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。至少你找到了解决办法。 【参考方案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;
  

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

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

【讨论】:

以上是关于等待 QProcess 完成或持续时间超过 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

QProcess 被杀死或成功完成

如何使用 QProcess 等待子进程?

自定义 QProcess 对象在返回之前等待输出

使用持续时间超过 1 年的配置文件部署 iOS 应用程序 [重复]

Javascript,如何等待多个承诺[重复]

监控正在运行的 qprocess 并在 qprocess 完成时返回值