Саммерфилд Марк
Шрифт:
Функция addTransaction добавляет транзакцию в очередь транзакций вторичного потока и отключает команды Open, Save и Save As на время обработки транзакций.
Слот allTransactionsDone вызывается, когда очередь транзакций TransactionThread становится пустой.
Теперь давайте рассмотрим класс TransactionThread:
Класс TransactionThread содержит список обрабатываемых транзакций, которые выполняются по очереди в фоновом режиме.
Функция addTransaction добавляет транзакцию в очередь транзакций и запускает поток транзакции, если он еще не выполняется. Доступ к переменной—члену transactions защищается мьютексом, потому что главный поток мог бы ее модифицировать функцией addTransaction во время прохода по транзакциям transactions вторичного потока.
Функции setImage и image позволяют главному потоку установить изображение, для которого будут выполняться транзакции, и получить обработанное изображение после завершения всех транзакций. И вновь мы защищаем доступ к переменной—члену при помощи мьютекса.
Функция run просматривает очередь транзакций и по очереди выполняет все транзакции путем вызова для них функции apply.
После старта транзакции мы генерируем сигнал transactionStarted с сообщением, выводимым в строке состояния приложения. Когда обработка всех транзакций завершается, функция run возвращает управление и QThread генерирует сигнал finished.