На этом шаге рассмотрим некоторые вопросы сохранения работоспособности приложений.
В некоторых ситуациях при интенсивных действиях в вашей программе может случиться так, что графический интерфейс программы "замрет" и станет неспособным обрабатывать события, связанные с интерактивными действиями пользователя (нажатие кнопки мыши или клавиши клавиатуры). Возьмем следующий пример:
for (int i = 0; i < 1000; ++i) {
// Выполнить трудоемкие вычисления
}
Этот код, если он исполняется в основном потоке, заблокирует на определенное время обработку событий, и, значит, пользовательские действия с интерфейсом все это время обрабатываться не будут, а также, если окно этой программы будет перекрыто другим, то оно не будет перерисовываться.
Один из возможных вариантов решения этой проблемы — исполнение подобного кода в отдельном потоке. Более простой способ — вызов метода CoreApplication:: processEvents(), который позаботится о том, чтобы все накопившиеся в очереди события были обработаны. Для этого наш пример должен быть изменен следующим образом:
for (int i = 0; i < 1000; ++i) { // Выполнить трудоемкие вычисления qApp->processEvents(); // Доставить накопившиеся события }
Теперь в каждой итерации цикла после выполнения действий осуществляется обработка событий, что дает программе возможность перед выполнением очередных действий отреагировать на накопившиеся события.
На следующем шаге рассмотрим реализацию фильтров событий.