GTK进阶学习:定时器

定时器在应用编程里用得很广,我们手机里的闹钟,幻灯片播放图片等应用都用到定时器。定时器,每隔一段时间干一件事(程序里表现为调用一个函数),像闹钟,每隔一天响一次。

定时器的创建:

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 = 0;//定时器id

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);
}  

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[])
{
        //1.gtk环境初始化
        gtk_init(&argc, &argv);

        //2.创建一个窗口
        GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        //设置窗口标题
        gtk_window_set_title(GTK_WINDOW(window), "倒计时");
        //设置窗口宽度
        gtk_container_set_border_width(GTK_CONTAINER(window), 0);

        //3.设置窗口默认大小
        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);

        //4.倒计时显示区
        GtkWidget *label = gtk_label_new("10");
        set_widget_font_size(label, 230, FALSE);
        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;
}

运行结果:

源码下载:http://download.csdn.net/download/lianghe_work/8945293

转自:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 03:53:35

GTK进阶学习:定时器的相关文章

GTK进阶学习:绘图事件

GTK界面只要有图片的地方,其底层实际上是通过绘图实现的,所以,我们很有必要学习一下绘图,这里我们使用 Cairo 进行相应的绘图操作. Cairo是用于绘制二维矢量图形的跨平台图形库,采用 C 语言实现,又被许多其它计算机语言所绑定.我们可以使用Cairo库在窗口中绘图,也可以用于生成PNG图片.PDF.PostScript.SVG文件.Cairo同时也是自由软件库,自GTK+2.8版本开始,Cairo成为GTK+库的一部分. 绘图实际上也是事件的一种,GTK中,绘图事件也叫曝光事件. 绘图时

GTK进阶学习:设置窗口背景图(可指定其大小)

设置窗口背景图(可指定其大小): #include <gtk/gtk.h> /* 功能: 设置背景图 * widget: 主窗口 * w, h: 图片的大小 * path: 图片路径 */ void chang_background(GtkWidget *widget, int w, int h, const gchar *path) { gtk_widget_set_app_paintable(widget, TRUE); //允许窗口可以绘图 gtk_widget_realize(widg

GTK进阶学习:GTK实现截图功能( 可以指定截图范围 )

按按钮截图,图片保存在当前路径为"save.png": #include <gtk/gtk.h> #include <cairo.h> /******************************************************** 功能:指定窗口区域截图,需要包含头文件cairo.h 参数: area: 需要截图的窗口指针 x, y, w, h: 截图的范围 path_name: 保存图片的路径名字,如 "./image/test.

GTK进阶学习:属性改变事件

当窗口初始化,被移动或拉伸时,会触发属性改变事件. 属性改变事件产生的信号:configure_event 其回调函数的定义如下: gboolean callback( GtkWidget *widget, GdkEventConfigure *event, gpointer data ) { event:属性事件结构体变量,系统内部的变量,不是用户传参的 event->x,event->y:窗口的起点坐标 event->width,event->height:窗口的大小 } 以下

GTK进阶学习:事件盒子

有些控件( 如:标签GtkLabel,图片控件GtkImage 等),不响应GDK事件,相当于鼠标在其上面点击,它是捕获不到的.用户通过事件盒子可以解决这个问题. 事件盒子给控件提供一个GDK窗口来捕获事件.我们把控件放在事件盒子里,当我们用鼠标点击这个控件时,这个事件盒子就能捕获到点击的状态. 事件盒子的创建: GtkWidget *gtk_event_box_new(void); 返回值:事件盒子指针 把控件添加到事件盒子里: void gtk_container_add(GtkContai

GTK进阶学习:鼠标事件

鼠标事件,可以理解为操作鼠标的动作.对于窗口而言,用户操作鼠标,窗口检测到鼠标的操作( 产生一个信号 ),然后去做相应处理( 调用其规定的回调函数 ),即可认为是鼠标事件,还是信号与回调函数的知识点. 信号与回调函数的使用请点击此处. 窗口默认不接收鼠标的操作,需要手动添加让其接收. 设置控件捕获(接收)相应的事件: void gtk_widget_add_events( GtkWidget *widget, gint events ); widget:控件 events:事件类型,它是GdkE

42步进阶学习—让你成为优秀的Java大数据科学家!

作者 灯塔大数据 本文转自公众号灯塔大数据(DTbigdata),转载需授权 如果你对各种数据类的科学课题感兴趣,你就来对地方了.本文将给大家介绍让你成为优秀数据科学家的42个步骤.深入掌握数据准备,机器学习,SQL数据科学等. 本文将这42步骤分为六个部分, 前三个部分主要讲述从数据准备到初步完成机器学习的学习过程,其中包括对理论知识的掌握和Python库的实现. 第四部分主要是从如何理解的角度讲解深入学习的方法.最后两部分则是关于SQL数据科学和NoSQL数据库. 接下来让我们走进这42步进

Android 进阶学习:事件分发机制全然解析,带你从源代码的角度彻底理解(上)

http://blog.csdn.net/guolin_blog/article/details/9097463 事实上我一直准备写一篇关于Android事件分发机制的文章,从我的第一篇博客開始,就零零散散在好多地方使用到了Android事件分发的知识.也有好多朋友问过我各种问题,比方:onTouch和onTouchEvent有什么差别,又该怎样使用?为什么给ListView引入了一个滑动菜单的功能,ListView就不能滚动了?为什么图片轮播器里的图片使用Button而不用ImageView?

【原创】PHP程序员进阶学习书籍参考指南

PHP程序员进阶学习书籍参考指南 @heiyeluren lastmodify: 2016/2/18 [初阶](基础知识及入门) 01. <PHP与MySQL程序设计(第4版)>  http://item.jd.com/10701892.html 02. <深入浅出MySQL 数据库开发 优化与管理维护 第2版> http://item.jd.com/11381295.html 03. <实战Nginx:取代Apache的高性能Web服务器> http://dwz.cn