已阅读:5,446 次
如何正确使用QThread进行多线程编程
ian | QT | 2011/03/17


最开始接触到QThread这个类的时候,和很多人一样,采用了下面这样的使用方法:

1
2
3
4
5
6
7
8
9
10
11
12
class MyThread : public QThread
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = 0);
 
protected:
     virtual void run()
    {
         //todo...
     }
};


也就是继承QThread,然后在run()里面加入自己的子线程需要运行的代码,调用的时候实例化MyThread,并调用Start()即可。
暂且不说其他,单这种继承QThread的方式就足够破坏你的项目代码的结构了,因为在每一个需要子线程的地方你都要为之创建一个新的XXThread类,然后重载其run()方法,使用的时候先实例化之,然后调用start()……
QT推荐的正确并且简洁得多的方法是这样来使用:

1
2
3
4
DataService* my_DataService = new DataService();
QThread dataThread;
my_DataService.moveToThread(&dataThread);
dataThread.start();

在一个典型的生产者-消费者模型中,代码的结构大致如下:

1
2
3
4
5
6
7
8
9
10
11
12
Producer producer;
Consumer consumer;
producer.connect(&consumer, SIGNAL(consumed()), SLOT(produce()));
consumer.connect(&producer, SIGNAL(produced(QByteArray *)), SLOT(consume(QByteArray *)));
 
QThread producerThread;
producer.moveToThread(&producerThread);
QThread consumerThread;
consumer.moveToThread(&consumerThread);
 
producerThread.start();
consumerThread.start();

这样,在使用QThread的封装时,就不会破坏我们的代码结构了,而且逻辑看上去也简洁得多。

原创文章,转载请注明:转载自ian的个人博客[http://www.icodelogic.com]
本文链接地址: http://www.icodelogic.com/?p=88

tags:

没有评论

发表评论

你需要先 登录 才能回复