Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

02 {

03 QMutexLocker locker(&mutex);

04 transactions.enqueue(transact);

05 if (!isRunning)

06 start;

07 }

Функция addTransaction добавляет транзакцию в очередь транзакций и запускает поток транзакции, если он еще не выполняется. Доступ к переменной—члену transactions защищается мьютексом, потому что главный поток мог бы ее модифицировать функцией addTransaction во время прохода по транзакциям transactions вторичного

потока.

01 void TransactionThread::setImage(const QImage &image)

02 {

03 QMutexLocker locker(&mutex);

04 currentImage = image;

05 }

06 QImage TransactionThread::image

07 {

08 QMutexLocker locker(&mutex);

09 return currentImage;

10 }

Функции setImage и image позволяют главному потоку установить изображение, для которого будут выполняться транзакции, и получить обработанное изображение после завершения всех транзакций. И вновь мы защищаем доступ к переменной—члену при помощи мьютекса.

01 void TransactionThread::run

02 {

03 Transaction *transact;

04 forever {

05 mutex.lock;

06 if (transactions.isEmpty) {

07 mutex.unlock;

08 break;

09 }

10 QImage oldImage = currentImage;

11 transact = transactions.dequeue;

12 mutex.unlock;

13 emit transactionStarted(transact->message);

14 QImage newImage = transact->apply(oldImage);

15 delete transact;

16 mutex.lock;

17 currentImage = newImage;

18 mutex.unlock;

19 }

20 }

Функция run просматривает очередь транзакций и по очереди выполняет все транзакции путем вызова для них функции apply.

После старта транзакции мы генерируем сигнал transactionStarted с сообщением, выводимым в строке состояния приложения. Когда обработка всех транзакций завершается, функция run возвращает управление и QThread генерирует сигнал finished.

01 class Transaction

02 {

03 public:

04 virtual ~Transaction { }

05 virtual QImage apply(const QImage &image) = 0;

06 virtual QString message = 0;

07 };

Класс Transaction является абстрактным базовым классом, предназначенным для определения операций, которые пользователь может выполнять с изображением. Виртуальный деструктор необходим, потому что нам приходится удалять экземпляры подклассов Transaction через

указатель transaction. (Кроме того, если мы его не предусмотрим, некоторые компиляторы выдадут предупреждение.) Transaction имеет три конкретных подкласса: FlipTransaction, ResizeTransaction и ConvertDepthTransaction. Нами будет рассмотрен только подкласс FlipTransaction; другие два подкласса имеют аналогичное определение.

01 class FlipTransaction : public Transaction

02 {

03 public:

04 FlipTransaction(Qt::Orientation orientation);

05 QImage apply(const QImage &image);

06 QString message;

07 private:

08 Qt::Orientation orientation;

09 };

Конструктор FlipTransaction принимает один параметр, который задает ориентацию зеркального отражения (по горизонтали или по вертикали).

01 QImage FlipTransaction::apply(const QImage &image)

02 {

03 return image.mirrored(

04 orientation == Qt::Horizontal, orientation == Qt::Vertical);

05 }

Функция apply вызывает QImage::mirrored для объекта QImage, полученного в виде параметра, и возвращает сформированный объект QImage.

01 QString FlipTransaction::message

02 {

03 if (orientation == Qt::Horizontal) {

04 return QObject::tr("Flipping image horizontally...");

05 } else {

06 return QObject::tr("Flipping image vertically...");

07 }

08 }

Функция messageStr возвращает сообщение, отображаемое в строке состояния в ходе выполнения операции. Данная функция вызывается из функции transactionThread::run, кoгдa гeнepиpyeтcя cигнaл transactionStarted.

Применение классов Qt во вторичных потоках

Функция называется потокозащищенной (thread—safe), если она может спокойно вызываться одновременно из нескольких потоков. Если две такие функции вызываются из различных потоков и совместно используют одинаковые данные, результат всегда будет вполне определенным. Это определение можно расширить на класс, и тогда класс будет называться потокозащищенным, если все его функции могут вызываться одновременно из различных потоков, не мешая работе друг друга, если они даже работают с одним и тем же объектом.

В Qt потокозащищенными являются классы QMutex, QMutexLocker, QReadWriteLock, QReadLocker, QWriteLocker, QSemaphore, QThreadStorage<T>, QWaitCondition и часть программного интерфейса QThread. Кроме того, несколько функций являются потокозащищенными, в частности QObject::connect, QObject::disconnect, QCoreApplication::postEvent, QCoreApplication::removePostedEvent и QCoreApplication::removePostedEvents.

Поделиться:
Популярные книги

Последний Паладин. Том 6

Саваровский Роман
6. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 6

Русская драматургия XVIII – XIX вв. (Сборник)

Пушкин Александр Сергеевич
Поэзия:
драматургия
6.25
рейтинг книги
Русская драматургия XVIII – XIX вв. (Сборник)

Бастард Императора. Том 9

Орлов Андрей Юрьевич
9. Бастард Императора
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Бастард Императора. Том 9

Базис

Владимиров Денис
7. Глэрд
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Базис

Бродяга

Первухин Андрей Евгеньевич
1. Бродяга
Фантастика:
попаданцы
5.40
рейтинг книги
Бродяга

Каратила

Поповский Андрей Владимирович
Детективы:
боевики
6.50
рейтинг книги
Каратила

Я уже граф. Книга VII

Дрейк Сириус
7. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я уже граф. Книга VII

Древесный маг Орловского княжества

Павлов Игорь Васильевич
1. Орловское княжество
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества

Вернуть невесту. Ловушка для попаданки

Ардова Алиса
1. Вернуть невесту
Любовные романы:
любовно-фантастические романы
8.49
рейтинг книги
Вернуть невесту. Ловушка для попаданки

Тринадцатый

Северский Андрей
Фантастика:
фэнтези
рпг
7.12
рейтинг книги
Тринадцатый

Я С СССР! Том III

Вязовский Алексей
3. Я спас СССР
Фантастика:
альтернативная история
5.86
рейтинг книги
Я С СССР! Том III

Адепт. Том второй. Каникулы

Бубела Олег Николаевич
7. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.05
рейтинг книги
Адепт. Том второй. Каникулы

Тринадцатый II

NikL
2. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый II

Сын счастья

Вассму Хербьёрг
2. Книга Дины
Проза:
современная проза
5.00
рейтинг книги
Сын счастья