`
wan_2004
  • 浏览: 140551 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Qt中线程跟信号槽的关系

阅读更多

Qt中有方便的信号和槽函数来完成我们各个类之间的调用。其中关于对象在线程中信号和槽的执行方式是值得瞧瞧的。

这里我做了一点实验。说明请看代码注解和qDebug输出

主窗口(这里介绍了各种连接信号方式)

#include "widget.h"
#include "ui_widget.h"
#include "mythread.h"
#include "obj.h"
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    thread = new MyThread();
    obj = new Obj();

    obj->moveToThread(thread);
    //注意 这句是移动对象到一个线程中,即他的槽执行都在这个指定的线程中

    connect(ui->pushButton,SIGNAL(clicked()),obj,SLOT(getSignaled()));
    //默认Qt::AutoConnection 如果在同一线程则是DirectConnection,不同则是QueuedConnection

    //connect(ui->pushButton,SIGNAL(clicked()),obj,SLOT(getSignaled()),Qt::QueuedConnection);
    //在对象的当前线程中执行,并且是按照队列顺序执行。当当前线程停止,就会等待下一次启动线程时再按队列顺序执行

    //connect(ui->pushButton,SIGNAL(clicked()),obj,SLOT(getSignaled()),Qt::DirectConnection);
    //这句不管理有没有线程都直接执行了

    //connect(ui->pushButton,SIGNAL(clicked()),obj,SLOT(getSignaled()),Qt::BlockingQueuedConnection);
    //(必须信号和曹在不同线程中,否则直接产生死锁)这个是完全同步队列只有槽线程执行完才会返回,否则发送线程也会等待,相当于是不同的线程可以同步起来执行

    //connect(ui->pushButton,SIGNAL(clicked()),obj,SLOT(getSignaled()),Qt::UniqueConnection);
    //跟默认工作方式相同,只是不能重复连接相同的信号和槽

    //connect(ui->pushButton,SIGNAL(clicked()),obj,SLOT(getSignaled()),Qt::AutoCompatConnection);
    //这个是为了连接QT4 到QT3的信号槽机制兼容方式,工作方式跟Qt::AutoConnection一样

    thread->start();
}

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

void Widget::on_stopBtn_clicked()
{
    thread->terminate();
}

void Widget::on_pushButton_2_clicked()
{
    delete thread;
}

void Widget::on_pushButton_3_clicked()
{
    obj->getCall();
}

void Widget::on_pushButton_4_clicked()
{
    thread->start();
}

 线程对象

#include "mythread.h"
#include <QDebug>
MyThread::MyThread(QObject *parent) :
    QThread(parent)
{
    this->connect(this,SIGNAL(destroyed()),this,SLOT(myDestroyed()));
    this->connect(this,SIGNAL(finished()),this,SLOT(myFinished()));
    this->connect(this,SIGNAL(started()),this,SLOT(myStarted()));
    this->connect(this,SIGNAL(terminated()),this,SLOT(myTerminated()));

}
void MyThread::myTerminated()
{
    qDebug() << tr("线程停止了");
}
void MyThread::myStarted()
{
    qDebug() << tr("线程开始了");
}
void MyThread::myDestroyed()
{
    qDebug() << tr("线程对象删除了");
}
void MyThread::myFinished()
{
    qDebug() << tr("线程完成了");
}

 普通对象(用于信号和槽接收)

#include "obj.h"
#include <QDebug>
Obj::Obj(QObject *parent) :
    QObject(parent),
    call_num(0)
{
}

void Obj::getSignaled()
{
    call_num ++;
    qDebug()<<  "有信号过来了";
    qDebug()<<  "call num" << call_num;
}

void Obj::getCall()
{
    call_num ++;
    qDebug()<<  "有调用过来了";
    qDebug()<<  "call num" << call_num;
}

 代码附上

最后提示,建议试试点击各种按钮,对应输出来看

3
1
分享到:
评论

相关推荐

    Qt thread pool 线程池样例,信号槽,跨线程 lambda

    在Qt中,信号槽允许对象之间进行通信,而无需关心它们之间的关系或线程。在多线程环境中,我们可以使用`QObject::connect()`来在不同线程间发送信号和接收槽。例如,你可以在主线程中创建一个信号,然后在线程池中...

    qt线程共享数据 信号和槽方式

    Qt线程间共享数据主要有两种方式: 使用共享内存。即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的; 使用singal/slot机制,把数据从一个线程...

    提供Qt中快速多次发射信号与耗时槽函数的链接解决方案

    Qt提供了一种异步信号槽连接方式,即`Qt::QueuedConnection`。当信号被发射时,槽函数不会立即执行,而是被放入事件队列中,等到调用`processEvents()`或事件循环下一次迭代时执行。这样,即使槽函数执行时间较长,...

    Qt多线程通讯

    本DEMO主要展示了如何在Qt中利用信号槽机制实现主线程与子线程之间的通信。 首先,我们要理解什么是Qt的信号槽机制。这是Qt框架的核心特性之一,它允许对象之间进行异步通信。当一个对象发出一个信号时,其他对象...

    QT不触发readyread信号槽的原因.zip

    QT的readyread信号槽总是不被触发的原因 大家在使用QT的时候有没有遇到过第一次能触发readyread信号槽,执行函数.但是就再也触发不了readyread信号槽的情况呢? 我来告诉你答案

    QT中多线程

    请注意,由于QT不直接支持`pthread_create`,因此在QT线程中使用非QT线程函数时,你需要手动同步数据,避免竞态条件和死锁。 至于参数传递,`pthread_create`允许通过`arg`参数向线程函数传递任意类型的数据。你...

    QT信号槽传递自定义结构体示例

    标题"QT信号槽传递自定义结构体示例"中提到的关键点在于,我们将利用QT的信号槽机制传递一个自定义的数据结构,即`ArbStruct`。这个结构体可以包含任何我们需要的数据成员,比如整型、字符串、浮点数等,以满足特定...

    qt 多线程 防止主线程做循环操作导致界面假死

    Qt提供了两种线程模型:QThread类和信号槽跨越线程的能力。QThread是Qt中处理线程的基础类,可以创建新的线程并运行对象。另一种方式是通过信号槽机制,利用QObject的threadAffinity属性和moveToThread()函数,将...

    QT多线程实战源代码(QThread)

    3. **线程同步**:QT提供了信号和槽机制,允许线程间的通信。通过connect()函数连接信号和槽,可以在不同线程之间传递信息。 4. **线程退出**:使用quit()或terminate()方法结束线程。其中,quit()会使得run()函数...

    Qt核心机制、Qt元对象系统、Qt信号槽原理

    - Qt 的信号和槽机制是类型安全的,支持多线程环境,并且可以在运行时动态连接和断开。 - 除了传统的函数式信号和槽,Qt 5 引入了基于 C++11 样式的方法签名的信号和槽,提高了代码的可读性。 3. **属性系统**: ...

    qt多线程高效下载文件

    例如,我们可以在子线程中更新QNetworkReply的下载进度,然后通过信号发送到主线程,主线程再通过槽函数更新UI。 5. **异步编程**:在Qt中,网络操作通常是异步的,这意味着它们不会阻塞调用线程。这在多线程下载中...

    Qt中在子线程中调用定时器

    本主题聚焦于如何在Qt的子线程中使用定时器,并通过信号和槽机制进行线程间通信。让我们深入探讨这个过程。 首先,我们要明白Qt的事件循环和线程的关系。每个线程都有自己的事件循环,而定时器(QTimer)是基于事件...

    Qt多线程实现 时间刷新

    总结来说,这个例子展示了如何利用Qt的多线程功能和信号槽机制实现在次线程中获取系统时间,并在主线程的界面上实时显示。这有助于提高程序的响应速度,确保用户界面始终保持流畅,同时进行后台的处理任务。在实际...

    QT线程及多线程

    QT线程及多线程是Qt库中的一个重要组成部分,它为开发者提供了在C++环境中进行并发编程的能力。在现代计算机系统中,多线程技术被广泛应用于提高程序的执行效率和响应速度,尤其是在处理耗时任务或者需要同时进行多...

    QT多线程编程、主线程与子线程交互数据

    QT提供了一些安全机制,如信号槽(Signals & Slots)机制,确保在多线程环境中安全地传递数据。信号和槽是QT的事件驱动机制,可以跨越线程边界。为了在不同线程之间发送信号,需要使用`moveToThread()`函数将对象...

    Qt 串口,多线程(子线程处理串口信号)

    - **信号槽跨线程**:在子线程中处理串口信号时,需要确保信号槽的正确连接。由于信号和槽可能在不同线程中,需要使用`Qt::DirectConnection`或`Qt::QueuedConnection`来保证线程安全。 - **线程同步**:为了防止...

    Qt不同类进行信号与槽建立,并传递参数

    此外,Qt5引入了新的C++11风格的信号槽语法,可以使用`&`操作符直接引用成员函数,使得代码更加简洁: ```cpp connect(classA, &ClassA::buttonClicked, this, &ClassB::handleButtonClicked); ``` 总之,Qt的信号...

    QT多线程的实现方式:QThread run优雅的创建与退出QT多线程

    与标准C++库中的std::thread不同,QThread有自己的事件循环,使得线程可以处理信号和槽,这使得在QT环境中使用多线程更加方便和灵活。 二、QThread的创建 创建QThread对象时,通常会继承QThread并重写run()方法。...

Global site tag (gtag.js) - Google Analytics