Qt中的线程

Threading in Qt

本文关键字:线程 Qt      更新时间:2023-10-16

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

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

谢谢。

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

一句话:IMHO,使用QThread最简单的方法是创建一个QObject子类,使用信号/插槽,并使用moveToThread使对象生活在具有不同事件循环的不同线程中
不幸的是,如果您绝对需要"while(true)"类型的线程,这是不起作用的,但在Qt中通常是可以避免的。

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

有关更多详细信息,请查看。。

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

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

要创建自己的线程,请使用子类QThread并重新实现run()

不过,这有点令人费解,因为(正如shobi在另一个答案中指出的那样)这是一个丑陋的设计,而且还有另一种解决方案。