【Qt study】之 线程 粗浅了解

5 篇文章 0 订阅

注:笔者只记录自己使用过的,粗浅了解,有其他想法,敬请讨论,其他线程相关待更新

QThread

通过 继承QThread

这是文件发送的类

#ifndef FILESEND_H
#define FILESEND_H

#include <QObject>
#include "QThread"
#include <QQueue>
#include <queue>
#include "tools.h"
using namespace std;

class fileSend : public QThread
{
    Q_OBJECT
public:
    explicit fileSend(QThread *parent = nullptr);

    void closeThread();

protected:
    virtual void run();//重点是重写这个函数,里面是一个独立的while(1)

signals:

public slots:
public:

private:
    volatile bool isStop;

};

#endif // FILESEND_H
#include "filesend.h"
#include <QDebug>
#include <QMutex>

fileSend::fileSend(QThread *parent) : QThread(parent)
{
    isStop = false;
}

void fileSend::closeThread()
{
    isStop = true;
}

void fileSend::run()
{
    uint8_t count = 0;
    while (1)
    {
        if (isStop)
            return;
/**TODO
这里面是我们要实现主要任务
*/
       

/*线程挂起时间*/
        sleep(1);
    }
}

界面调用
*.h中

fileSend *fileSendThread;

*.cpp中

	
	/*第一步 线程初始化*/
    fileSendThread = new fileSend;//fileSendThread 创建需要的类指针
	/*开启一个线程*/
    fileSendThread->start();
    qDebug() << "主线程id:" << QThread::currentThreadId();//这会儿 run函数会周期性执行

当然线程还需要退出,以及资源回收,如果不写,可能会报警告意思是程序结束了,线程还在run

	//在析构函数里面
		fileSendThread->quit();
        fileSendThread->wait();
        fileSendThread = nullptr;

这里应该先调用closeThread(),笔者代码里没写,直接释放简单粗暴☹

直接使用QThread

*.h

	CanAnaly *Canals;
    QThread *CanAnalyThread;

*.cpp中

	Canals = new CanAnaly;
    CanAnalyThread = new QThread(this);

    /* 把Canals转为线程 */
    Canals->moveToThread(CanAnalyThread);

    /* 线程启动 */
    CanAnalyThread->start();

在我们需要线程的类中通过定时器来实现周期性调度

  /* 自动收发定时器 */
   QTimer *auto_receive_timer;
   QTimer *auto_transmit_timer;

通过定时器周期性发送任务信号,来达到线程的目的

CanAnaly::CanAnaly(QObject *parent) : QObject(parent)
{
   auto_receive_timer = new QTimer(this);
   auto_transmit_timer = new QTimer(this);

    /* 收发定时器 */
    connect(auto_receive_timer, SIGNAL(timeout()), this, SLOT(auto_receive()));
    connect(auto_transmit_timer, SIGNAL(timeout()), this, SLOT(auto_transmit()));

    /*开启定时器*/ 
//    connect(this,&CanAnaly::receive_msg_signals,this,&CanAnaly::auto_receive_timer_ctrl);

    auto_receive_timer->start(1);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值