七QT线程

Posted fantianliang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了七QT线程相关的知识,希望对你有一定的参考价值。

一、前言

       为什么要使用多线程?

       说一下我自己的理解,所谓的多线程,其实对CPU使用时间的划分,就好比原本一间商店一个人运行,当你买东西的时候,总是不得不等待,因为一个人肯定有些忙不过来。

       但是如果换成两个能力差一点的人,可能他们干的慢了一点,但是起码每次你在窗口买东西的时候,总会有人回答记录你的问题,我觉得这就是线程的意义-》让用户不用太久。

二、具体的线程用法

       QT里面的线程主要有两种用法,可以参考博客:

        1-继承QThread的线程用法

        2-继承QObject的线程用法

       本博客主要参考这个博客:关于QT主线程和工作线程更新界面的问题

三、工程构建

       1-建立工程

       Thread2_uiCount

        2-ui界面

       技术图片

 

 

      3-程序

        Thread2_uiCount.cpp

#include "Thread2_uiCount.h"
#include "mythread.h"
Thread2_uiCount::Thread2_uiCount(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    thread = new ThreadTest(this);
    thread->setObj(this);
    connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(slotBtnStartThread()));
    connect(this, SIGNAL(sigCount()), this, SLOT(slotCount()));
}
void Thread2_uiCount::slotBtnStartThread()
{
    if(thread != nullptr) 
    {
        thread->start();
    }
}
void Thread2_uiCount::runInThread()
{
    emit sigCount();
}
void Thread2_uiCount::slotCount()
{
    cnt++;
    ui.label->setText(QStringLiteral("当前计数:%1").arg(cnt));
}
void Thread2_uiCount::closeEvent(QCloseEvent* event)
{
    if (thread->isRunning())
    {
        thread->terminate();
        thread->quit();
    }
}

   Thread2_uiCount.h

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_Thread2_uiCount.h"
class ThreadTest;
class QCloseEvent;
class Thread2_uiCount : public QMainWindow
{
    Q_OBJECT

public:
    Thread2_uiCount(QWidget *parent = Q_NULLPTR);
    void runInThread();
    void closeEvent(QCloseEvent* event);
signals:
    void sigCount();//这个信号并没有被定义
private slots:
    void slotBtnStartThread();
    void slotCount();
private:
    Ui::Thread2_uiCountClass ui;
    ThreadTest* thread = nullptr;
    int cnt = 0;
};

         mythread.h

#ifndef _MYTHREAD_HPP
#define _MYTHREAD_HPP
#include <qthread.h>
#include "Thread2_uiCount.h"
//class Thread2_uiCount;
class ThreadTest :public QThread 
{
    Q_OBJECT
public:
    ThreadTest(QObject* parent);
    void setObj(Thread2_uiCount* obj);
protected:
    void run();
private:
    Thread2_uiCount* guiMain = nullptr;
};
#endif

        mythread.cpp

#include "mythread.h"
#include "Thread2_uiCount.h"
 ThreadTest::ThreadTest(QObject* parent)
    :QThread(parent)
{}
 void  ThreadTest::setObj(Thread2_uiCount* obj)
 {
     guiMain = obj;
 }
 void  ThreadTest::run()
 {
     while (true)
     {
         msleep(1);
         guiMain->runInThread();
     }
 }

四、运行结果

          技术图片

 

以上是关于七QT线程的主要内容,如果未能解决你的问题,请参考以下文章

26.Qt Quick QML-RotationAnimationPathAnimationSmoothedAnimationBehaviorPauseAnimationSequential(代码片段

newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段

Netty实战七之EventLoop和线程模型

七. 多线程编程11.线程的挂起恢复和终止

qt多个线程调用同一个类怎么处理

Qt如何循环创建线程