QT 4: программирование GUI на С++
Шрифт:
Функция addTransaction добавляет транзакцию в очередь транзакций и запускает поток транзакции, если он еще не выполняется. Доступ к переменной—члену transactions защищается мьютексом, потому что главный поток мог бы ее модифицировать функцией addTransaction во время прохода по транзакциям transactions вторичного
Функции setImage и image позволяют главному потоку установить изображение, для которого будут выполняться транзакции, и получить обработанное изображение после завершения всех транзакций. И вновь мы защищаем доступ к переменной—члену при помощи мьютекса.
Функция run просматривает очередь транзакций и по очереди выполняет все транзакции путем вызова для них функции apply.
После старта транзакции мы генерируем сигнал transactionStarted с сообщением, выводимым в строке состояния приложения. Когда обработка всех транзакций завершается, функция run возвращает управление и QThread генерирует сигнал finished.
Класс Transaction является абстрактным базовым классом, предназначенным для определения операций, которые пользователь может выполнять с изображением. Виртуальный деструктор необходим, потому что нам приходится удалять экземпляры подклассов Transaction через
Конструктор FlipTransaction принимает один параметр, который задает ориентацию зеркального отражения (по горизонтали или по вертикали).
Функция apply вызывает QImage::mirrored для объекта QImage, полученного в виде параметра, и возвращает сформированный объект QImage.
Функция 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.
Стеллар. Трибут
2. Стеллар
Фантастика:
боевая фантастика
рпг
рейтинг книги
Его огонь горит для меня. Том 2
2. Мир Карастели
Фантастика:
юмористическая фантастика
рейтинг книги
На границе империй. Том 9. Часть 4
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
рейтинг книги
Наследник
1. Рюрикова кровь
Фантастика:
научная фантастика
попаданцы
альтернативная история
рейтинг книги
