GTK线程的简单使用与线程中更新图形界面
1)线程的简单使用,通过一个简单例子来说明(能运行)
编译命令:
gcc `pkg-config gtk+-2.0 --cflags --libs gthread-2.0` -std=gnu99 -o thread thread.c
注意要加上gthread-2.0
- #include <gtk/gtk.h>
- GtkWidget *window;
- GtkWidget *label;
- void hello(){
- int i;
- for(i=0;;i++){
- /*使用gdk_thread_*()将要刷新的界面*/
- char buf[6];
- sprintf(buf,"%d",(int)i);
- /*睡眠一下*/
- sleep(1);
- gdk_threads_enter();
- gtk_label_set_text(GTK_LABEL(label),buf);
- gdk_threads_leave();
- if(i==100)i=0;
- }
- }
- int main( int argc,char *argv[] ){
- gtk_init (NULL,NULL);//这个函数这样使用不好,但在此例中简写它了
- /* 创建一个新窗口 */
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title(GTK_WINDOW(window),"thread number");
- gtk_widget_set_usize(GTK_WIDGET(window),200,60);
- /*创建一个标签*/
- label=gtk_label_new("0");
- gtk_container_add (GTK_CONTAINER (window), label);
- gtk_widget_show (label);
- gtk_widget_show (window);
- g_signal_connect (G_OBJECT (window), "destroy",G_CALLBACK(gtk_main_quit), NULL);
- /*线程的初始化*/
- if(!g_thread_supported()) g_thread_init(NULL);
- gdk_threads_init();
- /*创建线程*/
- g_thread_create((GThreadFunc)hello, NULL, FALSE, NULL);
- gdk_threads_enter();
- gtk_main ();
- gdk_threads_leave();
- return 0;
- }
2)线程中更新图形界面的方法:
要在GTK的线程中更新图形界面,则需要调用gdk_threads_enter();与gdk_threads_leave();将要更新图形界面的地方前后包围起来,
如:
- gdk_threads_enter();
- gtk_clist_append(GTK_CLIST(user_clist), text);
- gdk_threads_leave();
gdk_threads_*()的作用并不是进入线程,据网上说是线程同步用的。
但一定要将要更新的部位包裹住,有多少个地方需要更新界面,就用多少次gdk_threads_*(),将其包裹住,
如有线程函数:
- void Thread(){
- ……
- gdk_threads_enter();
- gtk_label_set_text(GTK_LABEL(label),"hello1.");
- gdk_threads_leave();
- ……
- gdk_threads_enter();
- gtk_label_set_text(GTK_LABEL(label),"hello2.");
- gdk_threads_leave();
- ……
- gdk_threads_enter();
- gtk_label_set_text(GTK_LABEL(label),"hello2.");
- gdk_threads_leave();
- ……
- }
(我就是在这弄了好久,才发现原来是要包裹住要更新的控件,不能加入其它别的代码才行)
以上是个人的一点小见解,若文中有错误,请大家多多提出意见,我会尽快改正。