如何在Qt中取消暂停线程

时间:2016-09-30 16:28:42

标签: c++ multithreading qt

我想知道是否有办法在Qt中取消暂停睡眠线程 我使用QThread :: msleep(ms)函数暂停线程 而且我想在时间耗尽之前取消该线程 有什么办法吗?

2 个答案:

答案 0 :(得分:4)

首先,如果你使用QSerialPort,你真的不必搞乱线程。你应该异步处理它。因此,您read()在连接到readyRead()信号的插槽中,如果您希望在写入之间有一些延迟,请在连接到其{{1}的插槽中使用QTimerwrite()根据@ deW1的评论建议发出信号。

如果你真的想要多线程,@ sploid的代码方法有很多错误:

互斥锁必须仅由锁定它的线程解锁。以下是documentation for QMutex::unlock()所说的内容:

  

解锁互斥锁。 尝试在与锁定它的线程不同的线程中解锁互斥锁会导致错误。解锁未锁定的互斥锁会导致未定义的行为。

  • QMutex用于保护对象,数据结构或代码段,以便一次只能有一个线程访问它。它不用于信号某个其他线程的线程。
  • A QWaitCondition允许线程告诉其他线程已满足某种条件。这是您需要用来告诉其他线程" 取消暂停"。

以下是它应该如何完成的:

timeout()

答案 1 :(得分:-2)

QMutex mut;

void InterruptMethod() {
  mut.unlock();
}

void SleepMethod() {
  mut.lock();
  const int kTimeout = 5000;
  bool over_event_come = mut.tryLock(kTimeout); // here was sleep
  if (over_event_come) {
    // unlock from another place
  } else {
    // exit by timeout
  }
  mut.unlock();
}