美文网首页
Qt多线程的实现方式

Qt多线程的实现方式

作者: Alliawell | 来源:发表于2022-03-08 08:57 被阅读0次

参考:

[1].Qt的4种多线程实现方式

[2].C++ std::thead class


简介QThread类

一、公共槽函数:

1)start():开始线程的执行,内部调用run()函数,run()又调用exec()。

2)quit():告诉线程的事件循环停止运行,并返回0(成功),等价于调用exit(0);

3)terminiate():「不推荐使用该函数」终止线程的执行。线程可能不会立即终止,取决于操作系统的调度。

二、信号:

1)started():在start()之后,在run()之前发射。

2)funished():在线程将要停止执行时发射。发射时,线程已经停止事件循环。不再执行新的事件,但是deferred deletion事件除外。可以把该信号连接到本线程中的对象的deleteLater()槽中。

三、公共函数:

wait():等待线程停止执行,通常和quit()配合使用。

方法1:把对象moveToThread到QThread中

适用场景:需要信号和槽通信

原理:对象使用线程的事件循环,然后外部给对象发送消息,对象就会在线程里执行槽函数。

注意:通常把线程的finished()信号连接到线程内对象的deleteLater()槽上,用来释放该对象。

class Controller :public QObject  { 

    Q_OBJECT     

QThread workerThread; //新建一个线程对象 

public:      Controller() {

          Worker *worker = new Worker;

    //1.连接信号和槽

          connect(this, &Controller::operate, worker, &Worker::doWork); 

        connect(worker, &Worker::resultReady, this, &Controller::handleResults); 

        connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);//finished 连接到deleteLater

//2. moveToThread

          worker->moveToThread(&workerThread); //把工作对象move到线程中

//3.启动次线程

        workerThread.start();

      }

      ~Controller() {

          workerThread.quit();

          workerThread.wait(); 

    } 

public slots:      void handleResults(const QString &);

  signals:      void operate(const QString &);  }; 

方法2:用C++的std::thead类

适用场景:不需要信号和槽通信。

参考:https://www.cplusplus.com/reference/thread/thread/

std::this_thread的4个静态函数 thread的4个构造函数,第1个只构建对象,没有线程执行;第2个即构建对象也执行线程 thread默认构造函数生成的对象不是joinable

std::thread::detach:调用该函数后,calling thread(例如主线程)和detached thread(例如次线程)各自独立运行,且彼此无法同步或阻塞;任意一个线程执行完毕,它的资源被释放。调用该detach函数后,thread对象编程not-jionable状态,就可以被安全销毁了。被detached的线程相当于是断了线的风筝,独立运行,不再受thread对象控制。即使thread对象被销毁,线程仍可以继续运行。

线程中等号“=”转移线程所有权

std::thread::join:等待线程执行完毕。

3种不能被join的情况

注意:运行类的成员函数时,需要传递隐形的this指针参数

// thread example

#include <iostream>      // std::cout

#include <thread>        // std::thread

class A{

public:

    void test(){ std::cout<<"A::test() is calling\n";}

};

void foo()

{std::cout<<"foo is running in thread id:"<<std::this_thread::get_id()<<std::endl;}

int main()

{

    A a;

  std::thread first (foo);    // spawn new thread that calls foo()

  std::thread second(&A::test, &a); //new thread that call member function of Class A

  std::cout << "main, foo and bar now execute concurrently...\n";

  // synchronize threads:

  first.join();                // pauses until first finishes

  second.join();              // pauses until second finishes

  std::cout << "foo and bar completed.\n";

  return 0;

}

相关文章

  • Qt多线程的实现方式

    参考: [1].Qt的4种多线程实现方式[https://blog.csdn.net/weixin_4484065...

  • QT多线程学习(三)

    上两篇篇举例使用了QT的多线程使用方式一和二下面举例使用线程池实现多线程,参考链接可看上一篇同样的,程序需要实现如...

  • PRO-010:Qt版本大嘴鱼

    本主题主要利用Qt的GUI与多线程,实现一个几何线条的动画。设计的技术:  Qt的图形绘制  Qt的信号与槽通信 ...

  • Java多线程1

    创建多线程的3种方式 1、继承Thread类实现多线程 2、实现Runnable接口方式实现多线程 定时器 线程的...

  • GCD方式的多线程

    GCD方式的多线程 概念讲解 NSOperation方式实现多线程

  • Java-多线程(一)

    NO.1 多线程简介 NO.2 多线程实现方式(一) NO.3 多线程实现方式(二) NO.4 匿名内部类实现线程...

  • 多线程(最全面试题04)

    Java实现线程有哪几种方式?1、继承Thread类实现多线程2、实现Runnable接口方式实现多线程3、使用E...

  • 创建线程的方式

    1创建线程的几种方式a.继承Thread类实现多线程b.实现Runnable接口方式实现多线程c.使用Execut...

  • 多线程经典面试题及答案

    java实现线程有哪几种方式 1.继承Thread类实现多线程2.实现Runnable接口方式实现多线程3.使用线...

  • OC_多线程实现的几种方式

    参考链接IOS多线程实现方式 实现程序多线程执行的三种方式: 1、 NSThread2、Cocoa NSOpera...

网友评论

      本文标题:Qt多线程的实现方式

      本文链接:https://www.haomeiwen.com/subject/epqgnltx.html