QThread 与 QObject的关系

本文详细介绍了QThread与QObject在多线程环境中的使用,包括QObject的可重入性、线程间事件循环、信号与槽的跨线程通信。强调了线程安全问题,如QObject子类的创建、线程中对象的生命周期以及如何正确地在线程间通信。并通过示例代码展示了不同类型的信号与槽连接方式。
摘要由CSDN通过智能技术生成

Threads and QObjects

QThread 继承 QObject.。它可以发送startedfinished信号,也提供了一些slot函数。

QObject.可以用于多线程,可以发送信号调用存在于其他线程的slot函数,也可以postevent给其他线程中的对象。之所以可以这样做,是因为每个线程都有自己的事件循环。

在进行下面的讲解之前,应该了解的重要的一点是:QThread 对象所在的线程,和QThread 创建的线程,也就是run()函数执行的线程不是同一个线程。QThread 对象所在的线程,就是创建对象的线程。我们通过一个例子说明更能清楚一点:

MyThread::MyThread(QObject *parent /* = NULL */):QThread(parent)

{

       qDebug()<<"MyThreadobject currentThreadId :"<<QThread::currentThreadId();

}

 

void MyThread::run()

{

       qDebug()<<"run()  currentThreadId : "<<QThread::currentThreadId();

}

 

int main(int argc, char *argv[])

{

       QApplication a(argc, argv);

       MyThread thread;

       qDebug()<<"mainThread : "<<QThread::currentThreadId();

       thread.start();

       returna.exec();

}


输出结果:MyThread所在的线程就是主线程,run()函数是新开的线程。

QObject Reentrancy

QObject.可重入的,它的大多数非GUI子类,例如QTimerQTcpSocketQUdpSocket and QProcess都是可重入的,使得这些类可以同时用于多线程。需要注意的是,这些类设计为从一个单一的线程创建和使用的,在一个线程创建对象,而从另外一个线程调用对象的函数并不能保证行得通。有三个限制需要注意:

1.    QObject的子对象必须在创建其parent的线程中创建。这意味着,你不能把QThread对象作为parent传递给创建在线程中的对象,因为QThread 对象本身在另外一个线程中创建。

2.    事件驱动对象只能用于单线程。尤其是在定时器机制和网络模块。例如,你不能在不是对象所处的线程start一个计时器或者链接一个secket。简单的说就是,你不能在线程A创建了一个计时器timer,然后在线程B从启动timer

我们可以验证一下:

class MyThread : publicQThread

{

       Q_OBJECT

public:

       MyThread(QObject *parent = NULL);

       ~MyThread();

 

public slots:

       voidtimeOutSlot();

protected:

       voidrun();

       QTimer *m_pTimer;

 

};

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值