Qt中的线程

时间:2012-03-10 10:27:02

标签: c++ qt

我在互联网上读到子类化(从Qthread派生一个类)然后编写run函数来执行所需的任务不是使用Qthread的正确方法。但是我已经在一些书籍和Qt文档中阅读过使用子类化方法了吗?

你能告诉我为什么不应该使用子类化方法吗?子类化Qthread是一种使用线程的简单方法(对我而言,因为我是初学者)。

感谢。

3 个答案:

答案 0 :(得分:2)

请参阅这篇关于QThread的精彩文章:The great QThread Mess by Christoph Eckert,它引导我以这种方式使用QThread,现在:Threading without the headache by Bradley T. Hughes

底线:恕我直言,使用QThread的最简单方法是创建一个QObject子类,使用信号/槽并使用moveToThread让对象生活在具有不同事件循环的不同线程中。
不幸的是,如果你绝对需要"while(true)"种线程,这不起作用,但在Qt中经常可以避免。

答案 1 :(得分:1)

QThread的设计目的是用作操作系统线程的接口或控制点,而不是用于放置要在线程中运行的代码的位置。我们面向对象的程序员是子类,因为我们想要扩展或专门化基类功能。我可以想到的用于子类化QThread的唯一有效理由是添加QThread没有的功能,例如:也许提供一个指向内存的指针,用作线程的堆栈,或者可能添加实时接口/支持。不应将用于下载文件,查询数据库或进行任何其他类型处理的代码添加到QThread的子类中;它应该封装在它自己的对象中。

了解更多详情请查看..

http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/

答案 2 :(得分:1)

QThread documentation明确指出子类化是正确的做法:

  

创建自己的主题,子类QThread并重新实现run()

虽然这有些令人费解,因为(正如shobi在another answer中指出的那样)它是一个丑陋的设计,并且有另一种解决方案。