Отправляет email-рассылки с помощью сервиса Sendsay

Практические советы по GTK+

  Все выпуски  

Практические советы по GTK+ (Работа с таймером)


Работа с таймером

В библиотеке Glib есть функции работы с таймером, то есть присутствует возможность в фоновом режиме периодически  вызывать заданную функцию. Работать с таймером очень просто, но всё же есть небольшие тонкости.

 

Создание таймера:

guint g_timeout_add(guint interval,GSourceFunc function,gpointer data);

или

guint g_timeout_add_seconds(guint interval_sec,GSourceFunc function,gpointer data);

где:

 interval - период времени (в милисекундах), через которое будет вызываться таймер

 interval_sec - период времени (в секундах), через которое будет вызываться таймер

 function - функция таймера, которая будет вызываться через время interval

 data - дополнительные данные, передаваемые в функцию таймера

Функция возвращает идентификатор таймера(больше нуля).

 

Удаление таймера:

gboolean g_source_remove(guint timer_id);

где:

 timer_id - идентификатор таймера, который был получен при его создании

Функция возвращает TRUE при успешном удалении таймера.

 

Функция таймера имеет следующий прототип:

gboolean GSourceFunc(gpointer data);

Если функция таймера вернёт FALSE, значит таймер будет автоматически уничтожен и больше не запустится, если TRUE - то таймер будет запущен снова через заданный период времени.

 

Вот минимум, которого достаточно для создание полноценного таймера.

При создании таймера, кратного целому числу секунд, предпочтительней использовать функцию g_timeout_add_seconds() для экономии ресурсов компьютера.

 

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

guint g_timeout_add_full(gint priority, guint interval, GSourceFunc function, gpointer data, GDestroyNotify notify);

guint g_timeout_add_seconds_full(gint priority, guint interval_sec, GSourceFunc function, gpointer data, GDestroyNotify notify);

где:

 priority - приоритет таймера (G_PRIORITY_DEFAULT,G_PRIORITY_HIGH,G_PRIORITY_DEFAULT_IDLE и т.д.)

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

 Остальные параметры как для функций g_timeout_add() и g_timeout_add_seconds().

 

 

Рассмотрим небольшой пример использования таймера:

В этом приложении будет создано окно, в котором раз в секунду будет обновляться время работы таймера в формате чч:мм:сс

 

#include <gtk/gtk.h>

 

// Функция таймера

gboolean TimerFunc(gpointer data)

//gboolean TimerFunc(GtkWidget *label)// можно было бы записать сразу так

{

       GtkWidget *label = GTK_WIDGET(data);

       static int counter=1;

       gchar *str = g_strdup_printf("%02d:%02d:%02d",counter/3600,(counter/60)%60,counter%60);

       gtk_label_set_text(GTK_LABEL(label),str);

       g_free(str);

       counter++;

       // снова запускать таймер

       return TRUE;

}

 

int main (int argc, char *argv[])

{

       GtkWidget *window, *label;

       gtk_init (&argc, &argv);

       window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

       // подключаем обработчик удаления окна

       g_signal_connect(GTK_OBJECT(window),"destroy",GTK_SIGNAL_FUNC(gtk_main_quit), NULL);

       label=gtk_label_new(NULL);

       gtk_container_add(GTK_CONTAINER(window),label);

       gtk_label_set_text(GTK_LABEL(label),"00:00:00");

       // устанавливаем таймер на обновление текстовой метки раз в секунду

       g_timeout_add_seconds(1,TimerFunc,label);// в доп. параметре передаём текстовую метку для обновления

       gtk_widget_show_all(window);

       gtk_main();

       return 0;

}

 

Благодаря использованию дополнительного параметра, передаваемого в функцию таймера, удалось обойтись без глобальных переменных.

 

Все выпуски, включая этот, можно найти в одном файле gtk_book.chm


В избранное