如何在Qt中取消线程暂停
How to unpause thread in Qt
我想知道是否有一种方法可以在Qt中取消休眠线程
我使用QThread::msleep(ms)函数暂停线程
我想在时间用完之前取消线程的暂停
有办法吗?
首先,如果您使用的是QSerialPort
,您真的不必搞砸线程。您应该异步处理它。因此,您的read()
在连接到readyRead()
信号的插槽中,如果您想在写入之间有一些延迟,请使用QTimer
和write()
在连接到timeout()
信号的插槽中,如@deW1的评论所建议的。
如果你真的想使用多线程,@sploid的代码方法有很多错误:
互斥锁只能由锁它的线程解锁。QMutex::unlock()
的文档是这样说的:
解锁互斥对象。尝试在不同的线程中解锁互斥锁,将导致一个错误。解锁未锁定的互斥锁会导致未定义的行为。
-
QWaitCondition
允许线程告诉其他线程某种条件已经满足。这是你需要用来告诉另一个线程"unpause"的。
QMutex
用于保护对象、数据结构或代码段,以便一次只有一个线程可以访问它。它不用于一个线程向其他线程发送信号。应该这样做:
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();
}
相关文章:
- 如何正确取消析构函数中的 Boost deadline_timer(在多线程环境中)?
- 正在取消线程池中运行的任意作业
- 在可拆卸线程完成操作时取消分配内存
- 取消来自辅助线程的请求以强制MPI_Wait返回
- 干净取消在输入/输出调用中被阻止的 std::线程
- 从另一个线程取消阻止一个线程
- 通过在引用线程对象来传递取消引用的“this”指针来在函数对象构造函数中创建线程是好是坏
- 启用从程序内部取消 openmp 线程
- 是否存在简单的指向布尔值作为线程取消标志的现实情况,无法有效地取消线程?
- 取消 std::线程使用 native_handle() + pthread_cancel()
- 取消引用指向不同线程中的原子对象的只读非原子指针是否安全
- std::condition_variable::wait()是POSIX线程取消点吗
- 如果最初发出 IO 的线程在窗口 8 下的 ReadFile 中阻塞,则 GetQueuedCompletionStatus 无法将 IO 从 IOCP 中取消排队
- pthread取消成功,但在线程的100个后无法创建线程
- 如何在 boost::asio 线程池中使任务可取消/可中断
- 通过写入外部变量来取消 c++ 线程是否安全/有效
- 您应该如何处理线程中的文件打开错误而不取消
- 正在取消卡在epoll_wait上的线程
- 线程在pthread_cond_wait中时取消线程是否会导致它重新获取相关的互斥
- 如何在Qt中取消线程暂停