用对事物的认知来理解来QThread

很久没来CSDN,也从未发过博客,最近为了解决Qt多线程网络编程中的一些问题,需要在网上搜索一些资料,但无意之中发现有关QThread使用方面的问题,个人觉得还是很有必要说说,或许对大家理解Qt有些帮助.

通过几年对Qt的使用和研究,个人觉得Qt这套框架面向对象的层次还是比较高的,尽管它的类和接口不像C#和Java那样丰富,但它的设计思想毫不逊色,QThread算是它的一个亮点,如果你真正理解了QThread,相信你会由衷的佩服Qt框架的设计者们是多么的高明.然而现实却不容乐观,从网上能搜到的资料来看,90%多的代码中的使用方式都违背了Qt的设计思想.百度一下就可以看到Qt的开放者们在大声疾呼"You’re doing it wrong…",希望大家能从这种错误的用法中走出来,写得非常好,我也是在看完这几篇文章后顿悟的,大家也可以去看看这些博客:

http://blog.qt.digia.com/blog/2010/06/17/youre-doing-it-wrong/

http://blog.qt.digia.com/blog/2006/12/04/threading-without-the-headache/

http://blog.csdn.net/dbzhang800/article/details/6557272

想必还有许多人对QThread还是比较陌生,因为我们使用Qt主要开放的界面相关的项目,有主线程足矣,只有碰到一些比较耗时任务如数据拷贝之类的需要使用线程来避免UI冻结.

那到底如何使用QThread才是正确的呢,很简单,一句话:不要子类化QThread,看了上面几篇博文的读者应该知道如何正确使用QThread,这里我就不多说了,更多的可以去查阅Qt手册中的相关专题,那里有更详尽的解释.

知道怎么用了,但为什么要设计这么古怪的线程呢?这个疑问由然而生,解开这个疑惑确实比较费劲,我们需要从Qt的整个框架和它的设计思想入手.Qt是高度面向对象的框架,究其本质,我们不得不回归到什么是面向对象的程序设计这个原始的问题上来,我的理解是:用代码去描述你所知的这个熟悉的世界和事物以及他们之间的联系.换句话说就是要以看待现实世界的方式去看待程序中的每个对象,通过自己的想象去富于他们生命,然后用语言将其描述出来,只不过使用的语言是C/C++等等这些程序设计语言.Qt框架的设计师们很好的做到了这点.

下面我还是把QThread更形象化的描述以下:

1. QThread的控制单位是对象(QObject及其派生类)而不是函数;

2. QThread不是为某项特定的任务而设计的;

3. 如果把一台正在运行的电脑上运行的那些程序看作Qt中的对象,那么QThread就是电脑主板上CPU中的每个核,为每个程序的运行提供动力.

4. 如果把Qt中的每个对象看成现实世界中的一个人,那么QThread就是这个人的生活圈子.

上面的这四点终究是为了说明QThreadQt中对象的工作平台或环境,和我们常见的pthread线程完全不同.他为对象的正常工作提供了动力和其所需的资源,如事件的分发等.事实上,Qt的整个框架都基于这个理念来实现的,他可算得上是Qt框架的灵魂了.理解了这一点,很多在多线程编程中碰到的问题和使用局限应该就很好理解了,处于同一线程上的不同对象工作是都是有序的,资源的使用上不存在竞争,因此可以直接访问;每个线程都独立成为一个个体各自运行,因此线程之间只能通过事件(采用发消息的方式)来交互(此时信号槽也采用事件来实现,即异步信号槽),原则上不许有直接的函数调用.

上面就是个人对QThread的一些理解,还是说得比较抽象,总的来说,就是希望大家能通过用对事物的认知来理解来QThread和Qt的整个框架.由于个人能力有限,Qt的许多方面也没有涉足.

最后Qt初学者建议一点:Qt手册是最详细的工具书和教程,不会多查手册准不会错, 谢谢!.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值