【Qt】多线程

方法1:QThread

  1. 关于为什么关闭线程,释放资源的时候要先quit(),然后wait()
    quit()函数是用来停止QThread的,但是由于Qt本身是事件循环机制,所以在调用完quit()后,QThread可能还没有完全停止,此时如果执行delete channel,程序就会报错。在执行quit()后,调用wait()来等待QThread子线程的结束(即从run()函数的返回),这样就能保证在清除QThread时,其子线程是停止运行的。

  2. 事件循环机制
    看到上面有一句话,“Qt本身是事件循环机制”,大家可能不理解什么是事件循环机制,大家可以看看这篇文章 https://zhuanlan.zhihu.com/p/72758194
    我理解的是,调用quit()之后,将线程停止了,但是如果用户再次触发这个线程的启动,那么会导致你delete 了一个正在运行的线程,因此需要wait()来等待QThread子线程的结束
    方法2:

方法2:movetoThread

对象不能有父类
进入多线程的是对象的槽函数

  • 线程1中movetoThread后
    在其他类中的槽函数也在线程2

ex
main.cpp

qDebug()<<"main "<<QThread::currentThread();
Sender *senderWorker;
QThread *senderThread;
senderWorker->moveToThread(senderThread);
senderThread->start();
senderThread->setPriority(QThread::TimeCriticalPriority);

thread.cpp

connect(sendTimer, &QTimer::timeout, this, &Sender::sendNext);
void Sender::sendNext()
{
    qDebug()<<"sendNext "<<QThread::currentThread();
}

输出main和sendNext 再两个线程中

https://subingwen.cn/qt/thread/#3-1-%E6%93%8D%E4%BD%9C%E6%AD%A5%E9%AA%A4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值