3.4.1 Основы главного цикла

Главный цикл в основном реализован в glib, которая имеет общую абстракцию для главного цикла. Gtk+ подключает главный цикл glib к соединению с X-сервером, и предоставляет удобный интерфейс (цикл glib довольно низкоуровневый по сравнению с циклом Gtk+). Основной интерфейс главного цикла Gtk+ показан в списке функций 3..12.

"gtk_main()" выполняет главный цикл. "gtk_main()" не вернет управление до тех пор, пока не будет вызвана функция "gtk_main_quit()". "gtk_main()" может быть вызвана рекурсивно; каждый вызов "gtk_main_quit()" завершает один экземпляр "gtk_main()". "gtk_main_level()" возвращает уровень рекурсии; то есть она вернет 0, если не работает ни одна "gtk_main()", 1, если работает одна "gtk_main()", и т.д.

Все экземпляры "gtk_main()" функционально идентичны; все они следят за одним подключением к X-серверу и работают с одной очередью событий. Экземпляры "gtk_main()" используются для блокирования, приостанавливая выполнение функции до наступления каких-то событий. Все программы Gtk+ используют этот прием для предотвращения выхода из "main()" во время выполнения приложения. Функция "gnome_dialog_run()" (см. раздел 7.2) использует рекурсивный главный цикл, поэтому она не вернет управление до тех пор, пока пользователь не нажмет кнопку диалога.

Иногда вы захотите обработать несколько событий без обработки потока управления в "gtk_main()". Вы можете произвести одиночную итерацию главного цикла, вызвав "gtk_main_iteration()". Она должна обработать одиночное событие, например; это зависит от того, какие задачи ожидают в очерели. Вы можете проверить, не ожидают ли какие-либо события обработки, вызвав "gtk_events_pending()". Вместе, эти две функции позволяют вам временно вернуть управление Gtk+, и таким образом графический интерфейс может наверстать упущенное. Например, во время длительного вычисления, вы захотите показать индикатор прогресса; вы должны позволить главному циклу Gtk+ периодически выполняться, тогда Gtk+ сможет перерисовать индикатор. Используйте следующий код: while (gtk_events_pending()) gtk_main_iteration();

Список функций 3..12: Главный цикл
"#include "<gtk/gtkmain.h>
void gtk_main() void gtk_main_quit() void gtk_main_iteration() gint gtk_events_pending() guint gtk_main_level()


Linux Land
2000-09-15