我有一个耗时较长的图像加载问题(图片很大),而且在加载时还执行一些操作。我不希望阻塞应用程序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
示例来编写这段代码。当我在Google和StackOverflow上搜索时,我还发现继承QThread
并不是一个好主意。
那么正确的做法是什么?正如我所说,我想要非阻塞GUI,在另一个线程中进行加载和操作,并发送一个信号,表示加载完成。在信号被发出后,视图应该被重绘。 我不太了解多线程,但我认为可以理解或具有足够的基本知识来理解基本思想。
QThread
本质上是有问题的,它就会被从库中移除。与其仅仅相信“永远不要使用 QThread”,你应该找出人们认为存在的问题,决定它们是否对你有效,并决定如何利用它们。或者,你可以使用平台特定(不一定可移植)的线程机制,例如 pthreads。只需不要在线程中驱动 UI,而是使用 Qt 事件告诉 UI 线程来驱动它。 - mahrun()
方法。我真的不确定为什么你的链接提出了一种误用的模式(有效或无效),因为Qt的文档似乎非常清晰。例如:http://doc.qt.digia.com/qt/threads-starting.html。 - mah