C++ Qt Programming - 28 - 35 - basic thread
1、写一个MyThread,建立3个线程并打印:
main中建立线程:
MyThread mThread1;
mThread1.name = "mThread1";
MyThread mThread2;
mThread2.name = "mThread2";
MyThread mThread3;
mThread3.name = "mThread3";
mThread1.start();
mThread2.start();
run()定义:
void MyThread::run()
{
qDebug() << this->name << "Running";
for (int i = 0; i < 1000; i++) {
qDebug() << this->name << i;
}
}
三个线程会交替打印。
2 线程优先级:
mThread1.start(QThread::HighestPriority);
3 线程 QMutex:死锁, two threads trying to access a resource at the same time
mutex的例子:
1)两个人想同时以相反方向通过同一扇门,就stuck了; // mutex把门,当有个人用这个门的时候,mutex会对其他人说stop
2)两个人想同时倒满一个杯子,快倒满时会溢的到处都是。
mutex的解决方式:
同一之间只能有1个人能访问。
qt的帮助中输入qmutex,有个例子写的不错,如下method1中乘5和除以4就会一起执行了:

视频例子:
for (int i = 0; i < 1000; i++) {
QMutex mutex;
mutex.lock();
if (this->stop) { //其它线程会改变这个stop变量值??
break;
}
mutex.unlock();
this->sleep(1);
qDebug() << this->name << i;
}
得到的结果却是:(why?)

30课,这里和视频里显示的不一致。
解决:把stop的初始值设成false就行了。但是lock之后,输出的速度就会非常慢!!
this->sleep(1); //这句也会让输出变慢!!
4 带GUI的线程
建立MyThread类的时候,可以在基类里面输入QThread,但代码中没有#include<QThread>,Q_OBJECT也没有!
注意点:
1)对话框类包含一个线程对象
2)线程发送信号,对话框用槽接收信号并显示
5 线程Waiting
等待线程的run执行结束后,再做一些事情?例子只是打印了0-1000,但不知道什么时候结束?
mThread1.start();
mThread1.wait(); //如果没有这句话,Done可能在打0-1000之前打印,有了这个wait,程序会等0-1000打印完后再打印Done
qDebug()<<"Done!";
6 之前建MyThread并继承自QThread的方式是错误的,a QThread is not an object!
cObject.moveToThread(&cThread);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义