【发布时间】:2026-02-10 12:15:01
【问题描述】:
我的图片加载很耗时(图片很大),加载时也做了一些操作。我不想阻止应用程序 GUI。
我的想法是在另一个线程中加载图像,发出图像已加载的信号,然后用该图像重绘视图。
我的做法:
void Window::loadImage()
{
ImageLoader* loaderThread = new ImageLoader();
connect(loaderThread,SIGNAL(imageLoaded()),this,SLOT(imageLoadingFinished());
loaderThread->loadImage(m_image, m_imagesContainer, m_path);
}
void Window::imageLoadingFinished()
{
m_imagesContainer->addImage(m_image);
redrawView();
}
class ImageLoader : public QThread
{
Q_OBJECT
public:
ImageLoader(QObject *parent = 0) : m_image(NULL), m_container(NULL)
void loadImage(Image* img, Container* cont, std::string path)
{
m_image = img;
m_container = cont;
...
start();
}
signals:
void imageLoaded();
protected:
void run()
{
//loading image and operations on it
emit imageLoaded();
}
protected:
Image* m_image;
Container* m_container;
}
我基于 Qt 中的 quedcustomtype 示例编写此代码。在 * 中搜索和搜索时,我还发现子类化 QThread 不是一个好主意。
所以问题是正确的方法是什么?正如我所说,我希望在另一个线程中完成非阻塞 GUI、加载和操作,并发出表示加载完成的信号。发出信号后,应重新绘制视图。 我对多线程了解不多,但想了解或有足够的知识来了解基本思想。
【问题讨论】:
-
如果
QThread本质上是坏的,它将被从库中取出。而不是仅仅相信“永远不要使用 QThread”,您应该找出人们认为存在哪些问题,确定它们是否对您有效,并决定如何使用它们。或者,您可以使用特定于平台的(不一定是可移植的)线程机制,例如 pthreads。只是不要在你的线程中驱动 UI,而是使用 Qt 事件来告诉 UI 线程来驱动它。 -
@mah 我不认为 QThread 天生就不好,但是有一些different understandings how to use it。
-
@Andreas 那篇博文似乎表明很多人不知道如何正确使用 QThread。帖子底部的链接有一个示例页面,其重点似乎是:要正确继承 QThread,您必须重载
run()方法。但是,当 Qt 的文档看起来很清楚时,我真的不确定为什么会像您的链接所暗示的那样对滥用模式产生一种看法(有效与否)。以doc.qt.digia.com/qt/threads-starting.html 为例。
标签: c++ multithreading qt qthread