#include <QSemaphore>#include <QList>#include <QMutex>
public: explicit MegaTransformer(QWidget *parent = 0); ~MegaTransformer(); static QSemaphore semaphore; static QMutex mutex; static QList<TaskClass> taskList;
#define QT_THREAD_SUPPORT......#include "ui_megatransformer.h"#include "HunteXTaskClass.h" // ссылаемся на TaskClassnamespace Ui{ class MegaTransformer;}class MegaTransformer : public QMainWindow{ Q_OBJECTpublic: explicit MegaTransformer(QWidget *parent = 0); ~MegaTransformer(); static QSemaphore semaphore; static QMutex mutex; static QList<TaskClass> taskList; private slots: void loadImages(); // слот, который открывает QFileDialog void timerUpdate(); // UI void loadingAllDone(); // пока не юзаетсяprivate: Ui::MegaTransformer *ui; QTimer *timer; void InitObjects(); void AddImageToProcess(char* imagePath);};
#include "HunteXThreadClass.h"#include "megatransformer.h" // возможно поэтому такая ошибка, но без этого хидера никак, так как юзаются MegaTransformer::semaphore|mutexvoid ThreadClass::run(){ while (true) { MegaTransformer::semaphore.acquire(); // ждем заданий от главной нитки MegaTransformer::mutex.lock(); // извлекаем задание
...#include "megatransformer.h"#include "HunteXThreadClass.h"QSemaphore MegaTransformer::semaphore;QMutex MegaTransformer::mutex;QList<TaskClass> MegaTransformer::taskList;ThreadClass *threads;void MegaTransformer::InitObjects(){ threads = new ThreadClass();}void MegaTransformer::loadImages(){ threads->run(); // а вот тут получаю ошибку (см. ниже)}
C++ (Qt)void ThreadClass::run(){ while (true) { MegaTransformer::semaphore.acquire(); // ждем заданий от главной нитки MegaTransformer::mutex.lock(); // извлекаем задание TaskClass task = MegaTransformer::taskList.takeAt(0); MegaTransformer::mutex.unlock(); if (task.imagePath == NULL) break; // пустое имя значит завершить нитку task.OpenImage(); // загрузка изображения emit signalLoad(task.numberOfImage, task.imagePath); // сообщаем что загрузили // ==========================================================================================// ВИДИМО ВОТ ЭТУ ЧАСТЬ ЛУЧШЕ ВСЕГО ВЫДЕЛИТЬ В ОТДЕЛЬНЫЙ ПОТОК ? ТОЧНЕЕ ПО ПОТОКУ НА ОПЕРАЦИИ А, В task.OperationA(); // Операция А task.OperationВ(); // Операция В// ========================================================================================== emit AllOperationsFinished(...); // ждем выполнения операций А, В ... выполнение операции 4 + ожидание выполнения ... выполнение операции 5 + ожидание выполнения }}
C++ (Qt)bool TaskClass::Process( void ) { switch (mCommand) { case cmd_OpenImage: OpenImage(): // выполняем команду ... AddImage2Process(CTask(cmd_ScaleImage, ...); // помещаем новую команду в очередь break; case cmd_ScaleImage: ... break; case cmd_EndOfJob: // специальная команда - выйти return false; } return true;}
case cmd_OpenImage: OpenImage(): // выполняем команду ... AddImage2Process(CTask(cmd_ScaleImage, ...); // помещаем новую команду в очередь break;
C++ (Qt)QList<TaskClass> MegaTransformer::taskList; void MegaTransformer::loadImages(){ QStringList imagesPath = QFileDialog::getOpenFileNames(...) for(int i=0; i<imagesPath.length();i++) { AddImageToProcess(imagesPath[i]); } threads->start();} void MegaTransformer::AddImageToProcess(QString imagePath){ QMutexLocker locker(&mutex); TaskClass task; // создание объекта TaskClass // ... и последующее заполнение ... taskList.push_back(task); // добавление задачи в очередь semaphore.release(); // есть работа для ниток-загрузчиков} void ThreadClass::run(){ while (true) { MegaTransformer::semaphore.acquire(); // ждем заданий от главной нитки MegaTransformer::mutex.lock(); // извлекаем задание TaskClass task = MegaTransformer::taskList.takeAt(0); MegaTransformer::mutex.unlock(); task.OpenImage(); // загрузка изображения emit signalLoad(task.numberOfImage, task.imagePath); // сообщаем что загрузили // ..... }}
C++ (Qt)class ThreadClass : public QThread{ ... signals: void signalHomo(std::list<double>);} ThreadClass::run(){ .... std::list<double> matrix; ... emit signalHomo(matrix);} class MegaTransformer : public QMainWindow{ ... private slots: void homoDone(std::list<double>);} connect(threads, SIGNAL(signalHomo(std::list<double>)), this, SLOT(homoDone(std::list<double>)), Qt::QueuedConnection); void MegaTransformer::homoDone(std::list<double> matrix){ // сигнал не поступает :(}
C++ (Qt)qRegisterMetaType< QList<double> >( "QList<double>" );