我在工作线程中想要睡一段特定的时间(通常是几百毫秒),但睡眠应该是可以中断的。以下是我的想法
void DummyScope::sleepForSamples() {
if(m_sampleSleep < 100) {
MySleeper::sleep(m_sampleSleep);
return;
}
// sleep in periods of 100 ms, to be responsible for shutdown requests
qint64 t = QDateTime::currentMSecsSinceEpoch();
qint64 end = t + m_sampleSleep;
while(t + 100 <= end) {
MySleeper::sleep(100);
t = QDateTime::currentMSecsSinceEpoch();
// TODO: check here whether we are interrupted
}
if(end > t) {
MySleeper::sleep(end - t);
}
}
然而,这看起来有点令人费解,我想知道是否有更好的方法来做到这一点。使用带有超时的QWaitCondition
- 等待更好的解决方案吗?
答案 0 :(得分:2)
'正在使用带有超时的QWaitCondition - 等待更好的解决方案吗?'
是!
sleep()循环除了每100毫秒不必要地运行外,平均“中断”延迟为50毫秒。
答案 1 :(得分:0)
绝对等待一个条件变量,并让随附的条件告诉你为什么你被打断了 如果你不必使用QT-threads,c ++ 11和boost允许你为wait_for / timed_wait添加一个谓词,所以虚假的唤醒不会弄乱你的超时。
当然,如果你可以更进一步并且不打扰超时(如果条件变量可以处理所有情况),那就更方便了。
答案 2 :(得分:0)
如果您从另一个线程锁定并解锁,则可以使用QMutex::tryLock(int timeout)
直接在互斥锁上等待。