在QThread中使用信号(SIGNAL)-槽(SLOT)

本文探讨了QThread中信号槽的使用,指出理解线程应从面向过程而非面向对象的角度出发。通过示例代码说明了调用`exec()`对槽函数执行的影响,解释了`moveToThread()`函数如何改变对象的事件处理线程,以及不开启事件处理机制时信号无法被槽接收的情况。文章还提到了线程ID在不同场景下的变化,并推荐了两篇关于QThread使用的大牛文章。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先引用Bruce Eckel的一句话,“理解线程的概念,应该用面向过程编程的思路去理解,而不应该用面向对象编程的思路去理解”。

然后,上两段代码:

1、会发生槽调用的代码

//ThreadSlotTest.h
#ifndef THREADSLOTTEST_H
#define THREADSLOTTEST_H

#include <QThread>
#include <QTimer>
#include <iostream>

using namespace std;

class ThreadSlotTest:public QThread{
    Q_OBJECT
private:
    QTimer timer;
public:
    //
    ThreadSlotTest(){
        moveToThread(this);
        timer.setInterval(1000);
        timer.start();
        connect(&timer,SIGNAL(timeout()),this,SLOT(slot1()));
    }

    //
    void run(){
        exec();//exec会让线程卡在这句话上,不会往下执行(除非调用exit或quit)
    }

public slots:
    void slot1(){cout<<"slot1:"<<currentThreadId()<<endl;}
};
#endif // THREADSLOTTEST_H




//main.cpp
#include <QtGui/QApplication>
#include <iostream>
#include "ThreadSlotTest.h"

using namespace std;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    cout&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值