Главный цикл в основном реализован в 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();
void gtk_main()
void gtk_main_quit()
void gtk_main_iteration()
gint gtk_events_pending()
guint gtk_main_level()