画像の読み込みに時間がかかります (画像が大きい)。また、読み込み時にいくつかの操作が行われます。アプリケーション 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;
}
quedcustomtype
このコードを書いているQtの例に基づいていました。スタックオーバーフローでグーグル検索して検索すると、サブクラス化QThread
はお勧めできないこともわかりました。
それで問題は、それを行う正しい方法は何ですか?私が言ったように、非ブロッキング GUI が必要で、読み込みと操作は別のスレッドで行われ、読み込みが完了したことを示す信号が表示されます。シグナルが発行された後、ビューを再描画する必要があります。 マルチスレッドについてはよくわかりませんが、基本的な考え方を理解したり、理解するのに十分な知識を持っていると思います。