QT多线程(一)

        最近做了些QT的项目,感触很深,写几篇博客,记录下来最近一段时间接触QT的一些相关内容。

        先简单介绍一下项目的基本功能,项目的基本功能是实时收发来自局域网的tcp消息,并处理完成数据。实时处理数据,这个问题有一个关键的一点是,数据接收的速度和处理的速度不匹配的时候,需要对接收到的数据进行暂时的缓存,这个按照程序的自上而下的顺序执行过程,肯定是不能满足要求的,所以,多线程的作用就体现出来了,多线程可以相互辅助工作,摆脱原有的一个进程只能自上而下执行的限制,更好的完成工作。

       下面简单介绍一下qt的线程:

       QT的线程,在实现自己的线程操作的时候,继承使用QThread这个类即可,下面我提供一个自己写的关于线程的Demo方便大家参考;

MyThread.h
#ifndef MYTHREADTASK_H
#define MYTHREADTASK_H

#include <QThread>
#include <QDebug>

class CMyThreadTask: public QThread
{
public:
    CMyThreadTask();
    ~CMyThreadTask(){}

    void run();					///< 启动任务
    void init();				///< 初始化任务
    void TaskStop();				///< 任务停止

private:
    bool stopped;

};

#endif // MYTHREADTASK_H

MyThread.cpp
#include "mythreadtask.h"

CMyThreadTask::CMyThreadTask()
{
    stopped = false;
}

void CMyThreadTask::init()
{
    /**
     * @brief start
     * 调用run()函数
     */
    stopped = false;
    start();					/// 自动调用run()函数(具体可以查看这个函数的定义)
}


void CMyThreadTask::run()
{
    while(!stopped) {
        /**
         * 执行线程的任务
         */
        qDebug()<<"I am run";
    }
    qDebug()<<"I have been stopped";
}

void CMyThreadTask::TaskStop()
{
    stopped = true;
}

Widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "mythreadtask.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_stop_clicked();

private:
    Ui::Widget *ui;

    CMyThreadTask *threadtask;			///< 任务类的对象
};

#endif // WIDGET_H

Widget.cpp
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    threadtask = new CMyThreadTask();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    threadtask->init();			/// 初始化任务
}

void Widget::on_pushButton_stop_clicked()
{
    threadtask->TaskStop();		/// 停止任务
}

 

        上面这个是一个简单的界面,start按钮开始任务,stop按钮停止任务。

        在QThread这个类中,start()函数,会自行调用run()函数,这个函数的定义void QThread::start(Priority priority = InheritPriority);从参数中可以看出,给了默认参数,也是该线程的优先级的定义。该函数在执行的过程中会自动调用run()函数。操作系统也将给按照给出的优先级在操作系统中执行。

        在使用MyThreadTask这个类时,通过调用start()函数,来开启线程。这个时候有一个问题,不知大家注意没有,就是run()函数中,while(!stopped);这个循环,对于stopped这个变量来说,初始化在init()和构造函数中,这个任务从调用run()函数,会直接进入这个while循环,在循环内如果没有改变stopped这个变量的值,那么这个循环会一直执行,这也是保证在某种需要线程始终运行,并且不退出的条件下执行的保证,在某种程度上,相当于while(1)。

       这个时候需要注意一些问题,对于某些机器来说,例如单核、双核、四核,这个循环会占用一个cpu,导致程序运行的时候,CPU占用率过高。对于这种多线程的任务,需要考虑到,在任务执行的时候,不要总是占着cpu资源不放,分析清楚任务的功能模块,适当的使用sleep()函数,暂时释放cpu资源,从而让机器能够有效的处理多线程任务。



  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt多线程Qt框架提供的一种多线程编程的解决方案,通过创建和管理多个线程,可以实现在程序中同时执行多个任务的能力。Qt提供了QThread类和QtConcurrent命名空间来支持多线程QThread类是Qt提供的多线程编程的基础类,它封装了与底层操作系统调用相关的函数,并提供了一套简单的API来管理线程的生命周期。通过继承QThread类,我们可以创建自己的线程类,并实现线程执行体run()函数。调用线程的start()函数即可启动线程,并在run()函数中实现需要在新线程中执行的任务。另外,QThread类还提供了其他一些方法,如wait()、msleep()等,用于线程的控制。 QtConcurrent命名空间是Qt提供的一个高级多线程编程的工具,其使用起来更加简单方便。QtConcurrent可以运行同步和异步的任务,主要通过函数调用和lambda表达式来实现。我们可以使用QtConcurrent提供的函数,比如map()、filter()等,将任务分解成多个小的任务,并在多个线程中同时执行。使用QtConcurrent,我们只需要关注任务的输入和输出,而无需关注线程的创建和管理。 无论是使用QThread类还是QtConcurrent命名空间,Qt多线程都遵循的原则是将任务分解成小的子任务,并在多个线程中同时执行,以提高程序的性能和响应速度。同时,Qt多线程也提供了线程间的通信机制,例如使用信号与槽机制、使用QMutex、QSemaphore等同步对象来保证数据的正确访问。 需要注意的是,在多线程编程中,我们需要注意线程之间的同步和互斥,以避免资源竞争和数据不一致等问题。Qt提供了多种同步和互斥的机制,如互斥锁、条件变量等,可以根据具体的需求选择合适的方式来保证线程之间的安全性。 总之,Qt多线程提供了一种方便易用的多线程编程解决方案,使我们可以在Qt程序中充分利用多核处理器的能力,提高程序的性能和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值