定时器在应用编程里用得很广,我们手机里的闹钟,幻灯片播放图片等应用都用到定时器。定时器,每隔一段时间干一件事(程序里表现为调用一个函数),像闹钟,每隔一天响一次。
定时器的创建:
guint g_timeout_add(guint interval, GSourceFunc function, gpointer data);
参数:
- interval
设置的时间间隔,以毫秒为单位( 1000即为1秒 )- function
回调函数的名字- data
给回调函数传的参数- 返回值
定时器id号
使用实例:
guint timer = g_timeout_add(500, (GSourceFunc)deal_time, NULL);
每隔500ms会执行一次deal_time()回调函数。
注意:当回调函数返回值为FALSE时,定时器执行一次后便会停止工作,不再循环执行。所以,要想定时器连续工作,循环执行所指定的回调函数,应该返回TRUE。
定时器的移除:
gboolean g_source_remove(guint tag);
参数:
- tag
定时器id号- 返回值
TRUE代表成功,FALSE代表失败
倒计时实例如下:
#include <gtk/gtk.h>
#include <stdlib.h>
#include <string.h>
guint timer;
// 定时器id
/* 功能: 设置控件字体大小
* widget: 需要改变字体的控件
* size: 字体大小
* is_button: TRUE代表控件为按钮,FALSE为其它控件
*/
void set_widget_font_size(GtkWidget *widget, int size, int is_button) {
GtkWidget *labelChild;
PangoFontDescription *font;
gint fontSize = size;
font = pango_font_description_from_string("Sans");
//"Sans"字体名
pango_font_description_set_size(font, fontSize*PANGO_SCALE);
//设置字体大小
if(is_button) {
labelChild = gtk_bin_get_child(GTK_BIN(widget));
//取出GtkButton里的label
} else {
labelChild = widget;
}
//设置label的字体,这样这个GtkButton上面显示的字体就变了
gtk_widget_modify_font(GTK_WIDGET(labelChild), font);
pango_font_description_free(font);
}
/* 功能: 定时器处理函数
* label: 主要用于显示数字
*/
gboolean deal_time( gpointer* label ) {
char buf[5] = "";
static int num = 10;
num--;
sprintf(buf, "%d", num);
gtk_label_set_text(GTK_LABEL(label), buf);
if(0 == num) {
num = 11;
//g_source_remove(timer); // 移除定时器
}
return TRUE;
//尽量返回TRUE
}
int main( int argc, char *argv[]) {
gtk_init(&argc, &argv);
//主窗口操作
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "倒计时");
gtk_container_set_border_width(GTK_CONTAINER(window), 0);
//设置窗口默认大小,设置一个最小大小
gtk_window_set_default_size(GTK_WINDOW(window), 320, 400);
//设置窗口在显示器中的位置为居中。
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
g_signal_connect( G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL );
//按关闭按钮可以把程序中断
// 倒计时显示区域
GtkWidget *label = gtk_label_new("10");
// label的创建
set_widget_font_size(label, 230, FALSE);
// 设置label的字体大小
gtk_container_add(GTK_CONTAINER(window), label);
// 定时器的创建, label传给回调函数
timer = g_timeout_add(500, (GSourceFunc)deal_time, (gpointer)label);
gtk_widget_show_all(window);
// 显示所有部件
gtk_main();
return 0;
}
程序运行效果图如下: