如何在Qt中取消线程暂停

How to unpause thread in Qt

本文关键字:取消 线程 暂停 Qt      更新时间:2023-10-16

我想知道是否有一种方法可以在Qt中取消休眠线程
我使用QThread::msleep(ms)函数暂停线程
我想在时间用完之前取消线程的暂停
有办法吗?

首先,如果您使用的是QSerialPort,您真的不必搞砸线程。您应该异步处理它。因此,您的read()在连接到readyRead()信号的插槽中,如果您想在写入之间有一些延迟,请使用QTimerwrite()在连接到timeout()信号的插槽中,如@deW1的评论所建议的。

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

互斥锁只能由锁它的线程解锁。QMutex::unlock()的文档是这样说的:

解锁互斥对象。尝试在不同的线程中解锁互斥锁,将导致一个错误。解锁未锁定的互斥锁会导致未定义的行为。

    QMutex用于保护对象、数据结构或代码段,以便一次只有一个线程可以访问它。它不用于一个线程向其他线程发送信号。
  • QWaitCondition允许线程告诉其他线程某种条件已经满足。这是你需要用来告诉另一个线程"unpause"的。

应该这样做:

class Thread : public QThread{
public:
    Thread(QObject* parent=nullptr):QThread(parent){
    }
    ~Thread(){}
    void InterruptWaitState(){
        QMutexLocker locker(&mutex);
        cond.wakeAll();
    }
protected:
    void run(){
        //waiting thread
        QMutexLocker locker(&mutex);
        if(cond.wait(&mutex, 5000)){
            // unlock from another place
        } else {
            // exit by timeout
        }
    }
private:
    QMutex mutex;
    QWaitCondition cond;
};
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();
}