该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
楼主可以通过GMainLoop(在Gtk内会包装成在gtk_main())和GSource等方法.相关知识请查阅Glib的手册
以下是Glib手册相关内容及用到的函数devhelp截图,可到glib网站查看
如果对Glib的对象系统感兴趣可查看相应Gobject手册(跟Glib手册是独立分开的),如下图(devhelp截图,可到glib网站查看)
这里根据楼主的情况,写了个例子Sample,希望对你或其他人有用.
这是运行时截图
以下是代码:
/*
* main.c
*
* Created on: 2018年3月5日
* Author: tom
*/
#include
#include
#include
#include
gboolean my_timeout_func (gpointer user_data){
GtkEntry *entry=user_data;
gint index=g_object_get_data(entry,"entry_index");//这里直接忽略GPOINTER_TO_INT(),按编程习惯应写成 gint index=GPOINTER_TO_INT(g_object_get_data(entry,"entry_index"));
gint count=g_object_get_data(entry,"entry_count");//同上
if(count>=10){
return G_SOURCE_REMOVE;//移除该"定时GSource",GMainLoop往后不再执行该"定时GSource".表现为GtkEntry内容不再更新.
}
count++;
g_object_set_data(entry,"entry_count",GINT_TO_POINTER(count));//更新GtkEntry的timeout次数,原内部相应数据会被覆盖;
gchar *str=g_strdup_printf("GtkEntry%d:timeout %d times",index,count);//创建要显示的"字符串".
gtk_entry_set_text(entry,str);//把刚生成的"字符串"设置GtkEntry显示的字符串
g_free(str);//由于创建的"字符串"是内存动态分配,须手动释放字符串
return G_SOURCE_CONTINUE;//继续执行该"定时GSource",表现为GtkEntry内容定时更新.
};
int main(int argc,char *argv[]){
gtk_init(&argc,&argv);
gint i=0;
GtkWindow *mwin=gtk_window_new(GTK_WINDOW_TOPLEVEL);
GtkBox *box=gtk_box_new(GTK_ORIENTATION_VERTICAL,10);//创建可包含10个GtkEntry的GtkBox容器.
GtkEntry *entry[10];//创建Entry控件指针的数组
for(i=0;i<10;i++){
entry[i]=gtk_entry_new();
//由于GtkEntry是承继GObject,所以可以用GObject的方法操作GtkEntry,这里涉及一些GObject的对象系统知识,请查看Glib-Object的开发手册(注意:该手册跟Glib开发手册是分开独立);
//这里注意一下,GINT_TO_POINTER(i)是把int数值转成指针形式,可通过GPOINTER_TO_INT()把数值转回int形式,若嫌麻烦可忽略不用,只是可读性差些.
g_object_set_data(entry[i],"entry_index",GINT_TO_POINTER(i));//往GtkEntry附加自定义数据"entry_index",用于处理GtkEntry的编号
g_object_set_data(entry[i],"entry_count",GINT_TO_POINTER(0));//往GtkEntry附加自定义数据"entry_count",用于处理GtkEntry的timeout次数
g_timeout_add(500,my_timeout_func,entry[i]);//用g_timeout_***方法往主循环添加定时执行函数,每500ms执行函数一次
//还有类似g_timeout_add_seconds(),只是计时单位为妙.下面的注释的语句跟上面功能一样.
//g_timeout_add_seconds(5,my_timeout_func,entry[i]);
//glib还有类似g_idle_add()方法,在Gmain空闲的时候随机执行指定函数,具体请看Glib开发手册GMainLoop一节;
gtk_box_pack_start(box,entry[i],FALSE,FALSE,0);//把GtkEntry放入GtkBox容器;
}
gtk_container_add(mwin,box);//把GtkBox容器放入主窗口;
g_signal_connect(mwin,"delete_event",gtk_main_quit,NULL);
gtk_widget_show_all(mwin);
gtk_main();
return EXIT_SUCCESS;
}