Перейти к содержимому
Compvision.ru
TroyashkA

Qt и многопоточность

Recommended Posts

Всем привет :)

Есть функция foo(), которая работает в GUI-потоке. Функция получает пути изображений в папке. Далее, каждое изображение должно загружаться в отдельном потоке, потому что изображения большие, именно поэтому решил обрабатывать каждое в другом потоке ...

Накодил небольшой класс:

Header:


#include <QThread>

#include "cv.h"

#include "highgui.h"

#include <Magick++.h>


using namespace Magick;


class ThreadClass : QThread

{

	Q_OBJECT


public: 

	ThreadClass(char *in_imagePath, int in_scaleWidth, int in_scaleHeight);


	private slots:

		// тут тоже что-то должно быть ...


protected:

	void run(); // запуск потока


public:

	volatile bool isLoadingDone;

	volatile bool isScaledDone;


	QGraphicsScene *scene;


private:

	void OpenImage(); // открытие изображения

	void ScaleImage(); // масштабирование изображения


	char* imagePath;

	Magick::Image *imImage;


	int scaleWidth, scaleHeight;

};

Source:

#include "megatransformer.h"

#include "HunteXThreadClass.h"

#include "IplImageToQImage.h"

#include "OpenCVMagickPP.h"


ThreadClass::ThreadClass(char *in_imagePath, int in_scaleWidth, int in_scaleHeight)

{

	imagePath = in_imagePath;

	scaleWidth = in_scaleWidth;

	scaleHeight = in_scaleHeight;


	// вообщем-то флаги по умолчанию равны false

	// дурная привычка задавать все поля в конструкторе 

	isLoadingDone = false;

	isScaledDone = false;

}


void ThreadClass::run()

{

	OpenImage();


	//


	ScaleImage();

}


void ThreadClass::OpenImage()

{

	imImage->read(imagePath);


	isLoadingDone = true;

	// тут видимо надо отправить

}


void ThreadClass::ScaleImage()

{

	Magick::Image *scaledImage(imImage);


	scaledImage->resize(Magick::Geometry(scaleWidth, scaleHeight));

	scaledImage->profile("*", Blob());


	QImage *qi = IplImageToQImage(MagickImageToIplImage(scaledImage), 0);


	QPixmap pixmap = QPixmap::fromImage(*qi);

	QPixmap sized = pixmap.scaled(this->scaleWidth, this->scaleHeight);


	scene->clear();

	scene->addPixmap(sized);


	delete qi;


	isScaledDone = true;

  }[/code]

Догадываюсь, что для каждой картинки придется создавать объект ThreadClass и засовывать его в пул потоков ... я правильно понял? И еще помогите разобраться с сигналами и слотами ... Вопросы такие:

1. Где именно надо вызывать connect? (думаю, что в функции foo(), после создания объекта ThreadClass?)

2. Как получить событие, что функция ThreadClass::OpenImage() закончила свою работу?

3. И еще мне необходимо, чтобы после работы, функция ThreadClass::ScaleImage() вернула объект scene GUI-потоку - то есть мне надо где-то в GUI-потоке хранить ссылки на объекты ThreadClass?

Спасибо!

[color=#0000ff]ВТЫКАЮ В http://doc.crossplat...lsandslots.html[/color] :)

Ну как обычно проблема решилась читанием мануалов и лазанием по форумам :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×