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


posted @   妖山鬼店  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示