Qt - 线程

Qt-线程线程 前言 Qt实现在线程中执行任务有4种方法,分别是: 1.创建一个派生于 QThread 类的子类,重写run函数,在run函数中执行任务 2. 创建一个派生于 QObject 的子类,调用 QObject::moveToThread() 方法将子类对象移动到子线程对象中。 3. 使用线程QThreadPool 4. 使用QtConcurrent执行并行任务这4种方法的完整代码示例在绑定的资源中,大家可以免费下载。 一 重写run函数的方法执行任务 局限性:只能在 run 函数中处理任务 使用步 阅读详情

方式一

1.创建线程类Thread 

2.继承QThread类

3.重写run函数

4.实例化线程类

5.调用start函数

示例:

//MyThread.h

#ifndef MyTHREAD_H
#define MyTHREAD_H

#include <QThread>

class MyThread : public QThread
{
    Q_OBJECT
private:
    int id;
public:
    explicit MyThread(QObject *parent = nullptr);
protected:
    void run() Q_DECL_OVERRIDE;
}

#endif // MyTHREAD_H
//MyThread.cpp

#include "MyThread.h"
#include <QDebug>

MyThread::MyThread(QObject *parent) :
    QThread(parent),
    id(0)
{

}

void MyThread::run()
{
    while(true)
    {
        qDebug()<<id++;
        sleep(1);
    }
}
//使用线程

MyThread *myThread = new MyThread;
myThread->start();

方式二

1.创建线程类

2.继承QObject类

3.增加run槽函数

4.实例化线程类

5.实例化QThread类

6.调用线程类的moveToThread函数(参数传入QThread类对象)

7.QThread类的started信号连接线程类的run槽函数

8.调用QThread类的start函数

示例:

//MyThread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QObject>

class MyThread: public QObject
{
    int id;
public:
    MyThread();
public slots:
    void run();
};

#endif // MYTHREAD_H
//MyThread.cpp

#include "MyThread.h"

#include <QDebug>
#include <QThread>

MyThread::MyThread() :
    id(0)
{

}

void MyThread::run()
{
    while(true)
    {
        qDebug()<<id++;
        QThread::sleep(1);
    }
}
//使用线程

QThread *thread = new QThread;
MyThread *myThread = new MyThread;
myThread->moveToThread(thread);
connect(thread, &QThread::started, myThread, &MyThread::run);
thread->start();

方式三

1.创建线程类

2.继承QRunnable类

3.重写run函数

4.实例化QThreadPool类

5.实例化线程类

6.调用QThreadPool类的start函数(参数传入线程类对象)

示例:

//MyThread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QObject>
#include <QRunnable>

class MyThread : public QObject, public QRunnable
{
    Q_OBJECT
    int id;
public:
    MyThread();
    ~MyThread();
public:
    void run() Q_DECL_OVERRIDE;
};

#endif // MYTHREAD_H
//MyThread.cpp


#include "MyThread.h"

#include <QDebug>
#include <QThread>

MyThread::MyThread() :
    id(0)
{

}

MyThread::~MyThread()
{

}

void MyThread::run()
{
    while(true)
    {
        qDebug()<<id++;
        QThread::sleep(1);
    }
}
//使用线程

QThreadPool *threadPool = new QThreadPool;
MyThread *myThread = new MyThread;
threadPool->start(myThread);

QT使用线程以及线程同步 <br />   首先转载一个博客,学习如何使用QT线程<br />http://hi.baidu.com/%D2%C0%C8%BB%BD%DA%D7%E0%C0%B6%B5%F7/blog/item/da39f4f29aa93d00b17ec522.html<br />QThread 似乎是很难的一个东西,特别是信号和槽,有非常多的人(尽管使用者本人往往不知道)在用不恰当(甚至错误)的方式在使用 QThread,随便用google一搜,就能搜出大量结果出来。无怪乎Qt的开发人员 Bradley T 阅读详情

相关推荐

QT线程

一、概念 Qt传统的用户界面应用程序都只有一个线程,一次执行一个操作,如果用户调用一个比较耗时的操作(大批量的I/O操作和高精深的算法等),甚至可能引发休眠的操作,那么用户界面将会冻结而不在被响应,而出现“假死”现象。那么我们就需要使用到线程来解决这个问题 1、什么是进程? 电脑中时会有很多单独运行的程序,每个程序有一个独立的进程,而进程之间是相互独立存在的。 广义上是指正在运行的程序实例,狭义上说指的是程序被加载到内存中执行的后得到的进程。 每个进程都会有4G的内存空间。 一个程序可以有多个进

u012670181的博客 1731

Qt源码分析之QObject

Qt的QObject1.试验代码:#include #include #include int main(int argc, char *argv[]){ QApplication app(argc, argv); int size = sizeof(QObject); QPushButton* quit = new QPushButton("Quit"); delete quit

oowgsoo的专栏 1万+

Qt线程总结

Qt线程提供了支持,它引入了一些基本与平台无关的线程类、线程安全传递事件的方式和全局Qt库互斥 量允许你从不同的线程调用Qt的方法。Qt中与线程应用相关的类如下: 使用线程需要Qt提供相应的线程库的支持,因此,在编译安装Qt时,需要加上线程支持选项。 当在Windows操作系统上编译Qt时,线程支持是在一些编译器上的一个选项。在Windows操作系统上编译 应用程序时,通过在qconfig.h文件中增加一个选项来解决来解决这个问题。 在Mac OS X和Unix上编译Qt时,你应在运行configure

道亦无名 8645

Qt 线程

QThread(线程),代表一个在应用程序中可以独立控制的线程,可以和进程中的其他线程分享数据。QThread 对象管理程序中的一个控制线程QThreads 在 run() 中开始执行。默认情况下,run() 通过调用 exec() 来启动事件循环,并在线程内运行 Qt 事件循环。

qq_45303986的博客 7157

QThread使用方式——2

1.创建一个由QObject派生的子类MyWork。2.创建MyWork对象,注意不要指定父对象。6.调用MyWork对象的工作函数。4.用QObject提供的。函数将Work对象移到子线程中。

weixin_66651900的博客 249

QT学习笔记18多线程

通常情况下,应用程序都是在一个线程中执行操作。但是,当调用一个耗时操作(例如,大批量I/O或大量矩阵变换等CPU密集操作)时,用户界面常常会冻结。而使用多线程可以解决这一问题。 多线程有以下几个优势: 提高应用程序响应速度。 这对于图形界面开发的程序尤为重要,当一个操作耗时很长时,整个系统都会等待这个操作,程序就不能响应键盘、鼠标、菜单等操作,而使用多线程技术可将耗时长的操作置于一个新的线程

lzjsqn的专栏 1332

QT--线程

关于QT线程的使用

我有一颗薄荷糖的博客 8823

Qt线程】—— Qt线程详解

Qt线程详解

m0_56069910的博客 7512

QT线程

本文总结了 Qt线程开发中的关键知识点,涵盖 QThread 管理、跨线程通信、线程同步与资源竞争处理等内容。

weixin_56167571的博客 2309

QT教程】QT6多线程编程 QT线程编程

QT6线程概述QT6线程概述在软件开发过程中,多线程编程是一项核心且至关重要的技能,尤其是在需要处理大量数据或进行复杂计算时。QT6作为一套成熟的跨平台C++应用程序框架,提供了强大的线程支持,使得多线程编程更加简洁易行。QT6中线程的基本概念在QT6中,线程主要是通过QThread类来实现的。QThread是一个能够运行和管理的线程类,它提供了低层次的线程控制,比如线程的启动、停止和线程间的通信等。为什么使用多线程线程编程的主要优势在于它可以提高应用程序的响应性和性能。

QT性能优化QT原理源码QT界面美化 1433

QT线程: qt4和qt5使用示例

QT线程: qt4和qt5使用示例 简单介绍 代码分析 QT4: // 首先我们需要自定义一个线程类 MyThread class MyThread : public QThread { public: void run(); //处理数据函数 //必须是重载run, 我们看基类里面可以发现run是个虚函数 //添加信号 signals: void isDone; //...

tofu的博客 3441

QT线程编程

一、线程基础 1、GUI线程与工作线程 每个程序启动后拥有的第一个线程称为主线程,即GUI线程QT中所有的组件类和几个相关的类只能工作在GUI线程,不能工作在次线程,次线程即工作线程,主要负责处理GUI线程卸下的工作。 2、数据的同步访问 每个线程都有自己的栈,因此每个线程都要自己的调用历史和本地变量。线程共享相同的地址空间。 二、QT线程简介 QT通过三种形式提供了对线程...

于大博 4368

Qt创建多线程的两种方法

来源:https://github.com/czyt1988/czyBlog/tree/master/tech/QtThread 1.摘要 Qt有两种多线程的方法,其中一种是继承QThread的run函数,另外一种是把一个继承于QObject的类转移到一个Thread里。 Qt4.8之前都是使用继承QThread的run这种方法,但是Qt4.8之后,Qt官方建议使用第二种方法。两种方法区别不大...

ZONGXP的博客 6万+

QtQt线程开发—QThread

文章目录一、QThread的使用(1-1)方法一(1-2)方法二二、Qt线程运行的两种策略三、QThread的使用注意事项四、总结 一、QThread的使用 QThreadQt中用于在不同线程中运行代码的核心类,它是QObject的子类 ​ 关于QThread如何使用,Qt官方提供了两种方法: (1-1)方法一 ​ 步骤一:要创建执行某些代码的新线程,子类化QThread并重新实现run() ​ 步骤二:然后创建子类的实例并调用start()运行线程 如下代码片段: class MyThread : pu

iriczhao的博客 3145

qt线程的一些细节

首先这篇文章我也是东凑西拼,所以确实有些人会觉得很乱。但是在这个到处拼凑别人博客的时候,解决了我几个疑惑,所以大家可以带着这几个问题看这篇博客。 我的疑惑1:辨别对象所依赖的线程;辨别run()函数、槽函数是在主线程中执行还是在次线程中执行? 我的疑惑2:如何区分直接连接、队列连接、自动连接? 1. 线程的依附性   一个QObject实例是具有线程依附性的,或者说它驻留在某个线程。当...

学习之路 704

Qt 中父子关系使用总结

Qt 中父子关系使用总结

编程猿来如此 1507

关于QThread在设置parent之后,在程序关闭的时候出错问题的分析及解决方法

现象 因项目需要,写了一个继承自QThread线程类用于处理数据信息。 在给继承的线程类添加了父对象之后,程序可以正常执行,但是在关闭的时候报了如下的错误: 添加父对象的伪代码如下: MyThread *pThread = new MyThread(this); pThread->start(); 原因分析 借着报错信息,提示了Destroyed while thread is still running,直译过来就是在线程仍然运行的情况下,把它摧毁了。 也就是说线程还在跑的情况下,执行了其析构

“时光清浅,不觉多年”的博客 1042
上一篇: return
下一篇: Qt TCP网络通信
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值