void Thread::run(Object *myobject); // так можно ?
#include <QThread>#include "cv.h"#include "highgui.h"#include <Magick++.h>using namespace Magick;class ThreadClass : QThread{ Q_OBJECTpublic: 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;};
#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;}
C++ (Qt)void ThreadClass::run( void ){ while (true) { theSemaphore.acquire(); // ждем заданий от главной нитки theMutex.lock(); // извлекаем задание CTask task = theTaskList.takeAt(0); theMutex.unlock(); if (task.imagePath == NULL) break; // пустое имя значит завершить нитку task.OpenImage(); // занимаемся имеджем emit signalLoad(task.imagePath); // сообщаем что загрузили task.ScaleImage(); // масштабим emit signalScaled(task.imImage); // сообщаем что готово } }
C++ (Qt)void AddImage2Process( const CTask & task ){ QMutexLocker locker(&theMutex); theTaskList.push_back(task); theSemaphore.release(); // есть работа для ниток-загрузчиков}
CMutexLocker locker(&theMutex);