Qt多线程——方式2

QT多线程方式二:

1)设定一个类,继承于QObject

2)类中设置一个线程函数(只有一个是线程函数),内部使用一个while循环

3)创建线程对象,不能指定父对象

4)创建QThread子线程对象

5)自定义线程类加入子线程

a) thread—>start() 只是开启了线程,并没有启动线程处理函数

b)线程函数的启动,必须要通过signal——slot

//线程函数类   mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QObject>
class mythread : public QObject
{
    Q_OBJECT
public:
    explicit mythread(QObject *parent = nullptr);
    void myTimeOut();   //信号处理函数
    void setStop(bool isStop = true);
signals:
    void mysignal();
public slots:
private:
    bool isStop;
};

#endif // MYTHREAD_H

//线程函数类   mythread.cpp

#include "mythread.h"
#include <QThread>
#include <QDebug>

mythread::mythread(QObject *parent) : QObject(parent)
{
    isStop = false ;
}

void mythread::myTimeOut()
{
   while ( !isStop ) {
        QThread::sleep(1);
        emit mysignal();
        qDebug()<<"子线程号: "<<QThread::currentThreadId();
        if(isStop)
            break;
    }
}
void mythread::setStop(bool flag)
{
    isStop = flag ;
}

主体类  threadtest.h
#ifndef THREADTEST_H
#define THREADTEST_H
#include <QWidget>
#include "mythread.h"
namespace Ui {
class threadtest;
}
class threadtest : public QWidget
{
    Q_OBJECT
public:
    explicit threadtest(QWidget *parent = nullptr);
    ~threadtest();
    void dealSignal();
    void threadStop();
signals:
    void startThread();  //启动子线程的信号
private slots:
    void on_ButtonStart_clicked();
    void on_ButtonStop_clicked();
private:
    Ui::threadtest *ui;
    mythread *myT;
    QThread *thread;
};

#endif // THREADTEST_H
主体类  threadtest.cpp
#include "threadtest.h"
#include "ui_threadtest.h"
#include <QThread>
#include <QDebug>
threadtest::threadtest(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::threadtest)
{
    ui->setupUi(this);
    //动态分配空间,不能指定父对象
    myT = new mythread();
    //创建子线程
    thread = new QThread(this);
    //自定义的线程加入子线程
    myT->moveToThread(thread);
    connect(myT,&mythread::mysignal,this,&threadtest::dealSignal);
    qDebug()<<"主线程号: "<<QThread::currentThreadId();
    connect(this,&threadtest::startThread,myT,&mythread::myTimeOut);
    connect(this,&threadtest::destroyed,this,&threadtest::threadStop);
    //线程函数处理内部,不允许处理图形界面
    //线程后台处理数据
    //connect 第五个参数 的作用 ,只有在多线程才有意义 :1. 默认 2. 队列 3 直接
    //默认的时候
    //如果是多线程,默认使用队列
    //如果是单线程,默认是使用直接
    //队列方式:槽函数所在线程和接受者一样
    //直接方式:槽函数所在线程和发送者一样
}

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

void threadtest::on_ButtonStart_clicked()
{
    if(thread->isRunning() == true)
    {
        return;
    }

    thread->start(); //启动线程,但是没有启动线程函数
    myT->setStop(false);
    //不能直接调用线程处理函数,如果直接调用,那么线程处理函数和主线程在同一个线程
    //myT->TimeOut();  //主线程号:  0xa2f8      子线程号:  0xa2f8    19:39:47: 程序异常结束。
    //线程函数的启动只能通过signal-slot
    emit startThread();

}
void threadtest::dealSignal()
{

    static int i = 0 ;
    i++;
    ui->lcdNumber->display(i);
}

void threadtest::on_ButtonStop_clicked()
{
    if(thread->isRunning() == false)
    {
        return;
    }
    myT->setStop(true);
    thread->quit();
    thread->wait();

}
void threadtest::threadStop()
{
    on_ButtonStop_clicked();
    delete myT;
}




原文地址:https://www.cnblogs.com/AmyBKLP/p/11700844.html

时间: 2024-11-13 06:49:39

Qt多线程——方式2的相关文章

Qt多线程——方式1

UI线程为主线程,比较耗时的计算或操作,比如网络通信中的文件传输,在主线程中操作,用户界面可能会冻结不能及时响应. 多线程应用程序:在上述情况下,可以创建一个单独的工作线程来执行比较消耗时间的操作,并与主线程之间处理好同步与数据交互. 方式一: QT4.7 之前的版本 : 此版本如果一个线程挂了,退出这个线程,那么线程所对应的函数也退出 1)工作线程自定义一个类,必须继承于QThread,线程处理函数和主线程不在同一个线程 class MyThread:public QThread void r

QT多线程[转]

Qt作为一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造图形用户界面的强大功能.为了满足用户构造复杂图形界面系统的需求,Qt提供了丰富的多线程编程支持.从 2.2 版本开始,Qt主要从下面三个方面对多线程编程提供支持:一.构造了一些基本的与平台无关的线程类:二.提交用户自定义事件的 Thread-safe方式:三.多种线程间同步机制,如信号量,全局锁.这些都给用户提供了极大的方便.不过,在某些情况下,使用定时器机制能够比利用 Qt本身的多线程机制更方便地实现所需要的功能,同时也避免了

QT多线程实例

自定义信号与槽 Qt多线程简单实现 多线程间变量传递 工程结构 主线程类: //export_key.h#ifndef EXPORT_KEY_H#define EXPORT_KEY_H#include "main_widget.h"namespace Ui { class export_key; } class texport_work; class export_key : public QWidget {     Q_OBJECTpublic:    explicit export

QT开发(三十四)——QT多线程编程

QT开发(三十四)--QT多线程编程 一.QT多线程简介 QT通过三种形式提供了对线程的支持,分别是平台无关的线程类.线程安全的事件投递.跨线程的信号-槽连接. QT中线程类包含如下: QThread 提供了开始一个新线程的方法    QThreadStorage 提供逐线程数据存储    QMutex 提供相互排斥的锁,或互斥量    QMutexLocker 是一个辅助类,自动对 QMutex 加锁与解锁    QReadWriterLock 提供了一个可以同时读操作的锁    QReadL

QT多线程笔记

1.QT多线程涉及到主线程和子线程之间交互大量数据的时候,使用QThread并不方便,因为run()函数本身不能接受任何参数,因此只能通过信号和槽的交互来获取数据,如果只是单方面简单交互数据还过得去,如果涉及多次主.子线程之间的交互的时候,这种方式是很不方便的,这里采取另外一种方式,建一个继承自QObject的类,进行movetoThread()操作: class FileThread :public QObject { Q_OBJECT public: QString m_path; QFil

Qt多线程-QThread

版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QThread     本文地址:http://techieliang.com/2017/12/592/ 文章目录 1. 介绍  1.1. 线程优先级  1.2. 线程休眠 2. 基本使用  2.1. 建立QThread子类法  2.2. moveToThread方法 3. 线程同步  3.1. QMutex互斥量  3.2. QMutexLocker  3.3. QReadWr

Qt多线程学习:创建多线程

[为什么要用多线程?] 传统的图形用户界面应用程序都仅仅有一个运行线程,而且一次仅仅运行一个操作.假设用户从用户界面中调用一个比較耗时的操作,当该操作正在运行时,用户界面一般会冻结而不再响应.这个问题能够用事件处理和多线程来解决. [Linux有线程的概念吗?] 传统的UNIX系统也支持线程的概念,但一个进程里仅仅同意有一个线程,这样多线程就是多进程.Linux下的Posix线程(pthreads)是一种轻量级的进程的移植性实现,线程的调度由内核完毕,每一个线程都有自己的编号.假设使用线程,整体

Qt 多线程和网络编程学习

一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run()函数是在start()函数调用之后开始执行 QMutex类,互斥量/互斥锁,加锁解锁,原子操作 QWaitCondition类,一个线程在一定条件下等待其它线程的唤醒,在此之前一直处于休眠期.QWaitCondition::wakeOne()随机唤醒一个等待的线程,QWaitCondition::

Qt多线程程序设计中,可使用信号和槽进行线程通信

Qt多线程程序设计中,可使用信号和槽进行线程通信.下面是一个简单的示例. 该程序实现了线程中自定义一个信号和槽,定时1秒发送信号,槽响应后打印一条信息. [cpp] view plain copy  #include <QtCore/QCoreApplication> #include <QThread> #include <stdio.h> class MyThread:public QThread { Q_OBJECT public: MyThread(); voi