2013-02-21 161 views
1

我試圖找到一個解決以下情況:等待QProcess中完成或持續時間超過

一個QProcess中應該運行的命令,停止執行它達到期望的持續時間或命令時完成。這個QProcess由QThread Worker啓動。

這很容易通過這個來完成:

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

但也必須暫停孔的東西的功能。 我可以很容易地通過並行線程信號暫停QProcess中:

kill(task_.pid(), SIGSTOP); 

kill(task_.pid(), SIGCONT); 

但隨後waitForFinished持續時間繼續運行並超過而QProcess中被暫停。

有沒有人有一個想法如何做到這一點? 當我可以暫停運行QProcess和wait命令的孔QThread時,等待持續時間也會暫停。但是我怎樣才能得到QThread的pid? 是否有更好的Qt解決方案來執行QProcess暫停?

+0

我還沒有機會仔細檢查這一點,但是您可以像暫停它一樣,然後執行'task.setProcessState(QProcess :: NotRunning)'來指示該進程不再運行。我*認爲*應該停止waitForFinished,但我不是100%確定的。 – 2013-02-21 13:49:05

+0

感謝您的提示。不幸的是,它並沒有停止waitForFinished,它仍然用完。 我嘗試了一種現在正在工作的不同方法。如果您有興趣,請參閱以下內容:-)。 – Josch 2013-02-21 13:58:20

+0

奇怪的是,我認爲國家改變也會暫停waitForFinished。至少你已經找到了解決方案。 – 2013-02-21 14:23:41

回答

0

一個簡單而簡單的解決方案是自旋鎖。 我用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; 
    } 
} 

這可能不是一個好的解決方案,但它的工作是暫時的。

如果有人有其他想法,我會很樂意聽到他們。