等待 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 完成或持续时间超过 [重复]的主要内容,如果未能解决你的问题,请参考以下文章