《QT从基础到进阶·十九》QThread多线程使用

文章探讨了多线程编程中的问题,如如何在主线程和子线程间正确通信、线程锁的使用(包括静态全局锁与读写锁)、以及如何避免线程对象在构造和析构期间的并发问题。作者给出了两种多线程使用方式并强调了线程安全的重要性。

1、平时在写多线程的时候有时候会遇到下面一种情况:
在这里插入图片描述
情景:
this是主线程,model是子线程,把model move到线程后可以在主线程通过emit开启子线程,emit CalcuSignal();开启子线程执行StartCalculateAll,里面有是个循环。emit CancelSignal(true);开启子线程执行CancelSlot(bool),把bool值给到isFinish。
在StartCalculateAll里面循环的时候会判断isFinish值,如果是true就退出循环。
现在这样操作:
先emit CalcuSignal();//子线程执行十遍循环,每遍循环结束都会判断下isFinish
然后通过点击按钮触发emit CancelSignal(true); //我预想结果是一旦执行这条,就会在子线程CancelSlot方法中给isFinish赋true,然后循环会在当前这遍结束判断isFinish为true退出。
结果是:
先emit CalcuSignal();//开启子线程执行循环
循环还没结束emit CancelSignal(true); //无法开启子线程发送信号,直到循环全部结束才开启子线程把信号传递过来。

原因:
因为StartCalculateAll和CancelSlot都是在同一子线程中执行的,StartCalculateAll还没执行完的时候无法执行同一线程其他方法
这样修改:
先emit CalcuSignal();//开启子线程执行循环
循环还没结束在主线程model.CancelSlot(true); //这属于主线程给isFinish赋值,这样两者不在一个线程,循环会在当前结束判断isFinish为ture退

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦回阑珊

一毛不嫌多,一分也是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值