Qt多线程——方式1

UI线程为主线程,比较耗时的计算或操作,比如网络通信中的文件传输,在主线程中操作,用户界面可能会冻结不能及时响应。

多线程应用程序:在上述情况下,可以创建一个单独的工作线程来执行比较消耗时间的操作,并与主线程之间处理好同步与数据交互。

方式一:

QT4.7 之前的版本 : 此版本如果一个线程挂了,退出这个线程,那么线程所对应的函数也退出

  1)工作线程自定义一个类,必须继承于QThread,线程处理函数和主线程不在同一个线程

    class MyThread:public QThread

    void run() // run()虚函数,需要重写

    {

       sleep(5); //  父类为QThread,所以不用写成 QThread::sleep(5)

      emit isDone

    }

  2)  启动线程,不能直接调用run() ,start()间接调用run()

    Mythread *thread     thread->start()

部分代码:
   thread = new mythread(this); //分配空间
    connect(thread,&mythread::isDone,this,&pthWidget::DealDone);
    connect(this,&mythread::destroyed,this,&mythread::stopthread);  //当按窗口右上角关闭时触发线程关闭函数
    void pthWidget::stopthread()
   {
    thread->quit(); //terminate 暴力关闭 容易导致内存问题
    thread->wait();//等待线程处理完手头工作
  }
  void pthWidget::DealDone()
  {
      timer->stop(); //处理完数据以后 关闭定时器
      qDebug()<<"over";
  }

  void pthWidget::on_pushButton_clicked()
  {
      if(timer->isActive() == false)//如果定时器没有工作
            timer->start(100);   //100ms          
//    QThread::sleep(50);//非常复杂的数据处理,耗时较长
//启动线程处理数据
    thread->start();
}
///工作线程类
#include "mythread.h"
mythread::mythread(QObject *parent) : QThread(parent)
{

}
void mythread::run()
{
    sleep(50);//非常复杂的数据处理,耗时较长
    emit isDone();
}




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

时间: 2024-11-02 23:35:49

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

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

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