После создания нами файла переводов .ts необходимо его преобразовать в двоичный файл .qm, чтобы он был понятен для QTranslator. Для этого в Qt Linguist выберите пункт меню File | Release. Обычно мы начинаем с перевода только нескольких строк и затем выполняем приложение с применением файла .qm, чтобы убедиться, что все работает правильно.

Рис. 17.2. Qt Linguist в действии.

Если мы хотим заново сгенерировать файлы .qm для всех файлов .ts, мы можем запустить утилиту lrelease из командной строки следующим образом:

lrelease -verbose spreadsheet.pro

Если мы выполняли перевод 19 строк на французский язык и отметили флажком Done 17 из них, утилита lrelease выдаст следующий результат:

Updating 'spreadsheet_de.qm'...

Generated 0 translations (0 finished and 0 unfinished)

Ignored 98 untranslated source texts

Updating 'spreadsheet_fr.qm"...

Generated 19 translations (17 finished and 2 unfinished)

Ignored 79 untranslated source texts

Флажок Done игнорируется утилитой lrelease; он может использоваться переводчиками для идентификации законченных переводов и тех, перевод которых необходимо выполнить заново. Непереведенные строки при выполнении приложения выводятся на языке оригинала.

Когда мы модифицируем исходный код приложения, файлы перевода могут устареть. Решение этой проблемы заключается в повторном выполнении утилиты lupdate, обеспечении перевода новых строк и повторной генерации файлов .qm. Одни группы разработчиков могут посчитать удобным частое выполнение утилиты lupdate, а другие могут захотеть это делать только для почти готового программного продукта.

Утилиты lupdate и Qt Linguist достаточно «умные». Переводы, которые с какого-то момента не стали использоваться, сохраняются в файлах .ts на случай, если они потребуются когда-нибудь в будущем. При обновлении файлов .ts утилита lupdate использует «интеллектуальный» алгоритм слияния, позволяющий переводчикам сэкономить много времени при работе с текстом, который совпадает или подобен в различных контекстах.

Более подробную информацию относительно Qt Linguist, lupdate и lrelease можно найти в руководстве по Qt Linguist в сети Интернет по адресу http://doc.trolltech.com/4.1/linguist-manual.html. Это руководство содержит полное описание интерфейса пользователя для Qt Linguist и учебное пособие для поэтапного обучения программистов.

<p>Глава 18. Многопоточная обработка</p>

Обычные приложения с графическим интерфейсом имеют один поток (thread) выполнения и производят в каждый момент времени одну операцию. Если пользователь через интерфейс пользователя вызывает продолжительную операцию, интерфейс, как правило, «застывает» до завершения операции. В главе 7 («Обработка событий») даются некоторые способы решения этой проблемы. Применение многопоточной обработки — еще один способ решения данной проблемы.

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

В данной главе мы сначала продемонстрируем способы создания подкласса QThread и способы применения классов QMutex, QSemaphore и QWaitCondition для синхронизации потоков. Затем мы рассмотрим способы взаимодействия вторичных потоков с главным потоком в ходе цикла обработки событий. Наконец, мы завершим главу обзором классов Qt, объясняя, какие из них могут использоваться во вторичных потоках.

Многопоточная обработка представляет собой обширную тему, которой посвящается много книг. В данной главе предполагается, что вам уже известны принципы многопоточного программирования, поэтому основное внимание уделяется методам разработки многопоточных приложений средствами Qt, а не теме потоков выполнения в целом.

<p>Создание потоков</p>

Обеспечить многопоточную обработку в приложении Qt достаточно просто: мы только создаем подкласс QThread и переопределяем его функцию run(). Чтобы показать, как это работает, мы начнем с рассмотрения программного кода очень простого подкласса QThread, который периодически выводит на консоль заданный текст:

01 class Thread : public QThread

02 {

03 Q_OBJECT

04 public:

05 Thread();

Перейти на страницу:

Похожие книги