Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在Qt中解除线程暂停_C++_Multithreading_Qt - Fatal编程技术网

C++ 如何在Qt中解除线程暂停

C++ 如何在Qt中解除线程暂停,c++,multithreading,qt,C++,Multithreading,Qt,我想知道是否有办法解除Qt中休眠线程的暂停 我使用QThread::msleep(ms)函数暂停线程 我想在时间用完之前解除线程暂停 有什么方法可以做到吗?首先,如果您使用的是QSerialPort,那么您真的不必搞乱线程。您应该异步处理它。因此,您可以在连接到readyRead()信号的插槽中执行read(),如果您希望在写入之间有一些延迟,请按照@deW1的注释建议,在连接到其timeout()信号的插槽中使用QTimer和write() QMutex mut; void Interrup

我想知道是否有办法解除Qt中休眠线程的暂停
我使用QThread::msleep(ms)函数暂停线程
我想在时间用完之前解除线程暂停

有什么方法可以做到吗?

首先,如果您使用的是
QSerialPort
,那么您真的不必搞乱线程。您应该异步处理它。因此,您可以在连接到
readyRead()
信号的插槽中执行
read()
,如果您希望在写入之间有一些延迟,请按照@deW1的注释建议,在连接到其
timeout()
信号的插槽中使用
QTimer
write()

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();
}
如果您真的想使用多线程,@sploid的代码方法有很多错误:

互斥锁只能由锁定它的线程解锁。下面是报告的内容:

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

  • 用于保护对象、数据结构或代码段,以便一次只能有一个线程访问它。它不用于线程向其他线程发送信号
  • 允许线程告诉其他线程已满足某种条件。这是您需要用来告诉另一个线程“取消暂停”的内容
以下是应该如何做到这一点:

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;
};

首先,如果您使用的是
QSerialPort
,那么您真的不必搞乱线程。您应该异步处理它。因此,您可以在连接到
readyRead()
信号的插槽中执行
read()
,如果您希望在写入之间有一些延迟,请按照@deW1的注释建议,在连接到其
timeout()
信号的插槽中使用
QTimer
write()

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

互斥锁只能由锁定它的线程解锁。下面是报告的内容:

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

  • 用于保护对象、数据结构或代码段,以便一次只能有一个线程访问它。它不用于线程向其他线程发送信号
  • 允许线程告诉其他线程已满足某种条件。这是您需要用来告诉另一个线程“取消暂停”的内容
以下是应该如何做到这一点:

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
QWaitCondition
我有一个名为SerialSender的类(QThread的实现),它使用QSerialPort发送数据,每个QSerialPort::write(使用QThread::msleep)之间都有延迟,我想取消SerialSender线程的暂停以直接发送数据而无需等待,我想知道是否可以停止QThread::msleep函数的执行?为什么不创建一个具有您希望的延迟的计时器呢?或者,如果你想等待数据被写入,那么你就有了信号和插槽,这样就没有必要弄乱线程了。考虑到你无法精确测量其他进程完成所需的时间,我会有一个信号来触发该线程何时启动。加入计时器是一种延迟执行的方式,但实际上会减慢程序的速度。如果您能为您的问题提供更多的上下文,为什么要这样做?您是否正在尝试并行运行访问同一资源的两个线程?如果使用互斥体,那么“在时间用完之前”是什么意思?这是非常有价值的,因为看看
QMutex
QWaitCondition
我有一个名为SerialSender的类(QThread的实现),它使用QSerialPort发送数据,每个QSerialPort::write(使用QThread::msleep)之间都有延迟,我想取消SerialSender线程的暂停以直接发送数据而无需等待,我想知道是否可以停止QThread::msleep函数的执行?为什么不创建一个具有您希望的延迟的计时器呢?或者,如果你想等待数据被写入,那么你就有了信号和插槽,这样就没有必要弄乱线程了。考虑到你无法精确测量其他进程完成所需的时间,我会有一个信号来触发该线程何时启动。加入计时器是一种延迟暂停执行的方式,但实际上会减慢程序的速度。请不要从锁定互斥锁的线程以外的线程解锁互斥锁。查看我的答案。请不要从锁定互斥锁的线程以外的线程解锁互斥锁。看看我的答案。