QThread的使用总结

  Bradley T. Hughes 认为: QThread 应该被看做是操作系统线程的接口或控制点,而不应该包含需要在新线程中运行的代码。需要运行的代码应该放到一个QObject的子类中,然后将该子类的对象moveToThread到新线程中。
#include <QtCore/QCoreApplication>
#include <QtCore/QObject> 
#include <QtCore/QThread> 
#include <QtCore/QDebug>  
class Dummy:public QObject 
{  
    Q_OBJECT  
public:  
    Dummy(QObject* parent=0):QObject(parent) {} 
public slots:  
    void emitsig() 
    { 
        emit sig();
    } 
signals:  
    void sig(); 
}; 

class Object:public QObject
{  
    Q_OBJECT 
public: 
    Object(){} 
public slots:  
    void slot()  
    {   
        qDebug()<<"from thread slot:" <<QThread::currentThreadId(); 
    } 
}; 

int main(int argc, char *argv[]) 
{  
    QCoreApplication a(argc, argv);   
    qDebug()<<"main thread:"<<QThread::currentThreadId();   
    QThread thread;  
    Object obj;   
    Dummy dummy;   
    obj.moveToThread(&thread); 
    QObject::connect(&dummy, SIGNAL(sig()), &obj, SLOT(slot())); 
    thread.start();  
    dummy.emitsig();   
    return a.exec(); 
} 
另外:
在Qt4.3(包括)之前,run 是虚函数,必须子类化QThread来实现run函数。
而从Qt4.4开始,run默认调用QThread::exec()。这样一来不需要子类化QThread了,只需要子类化一个QObject就够了,这正是被Bradley T. Hughes推荐的方法。
终于看懂了,但不管怎么说,都应该是 QThread当初的设计导致的这种问题,而所有文档和例子中都没有提到该如何使用Qthread,进一步加剧了对QThread的这种误用。
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值