免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1081 | 回复: 0
打印 上一主题 下一主题

在gtk中应用线程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-06 21:06 |只看该作者 |倒序浏览

在GTK+中应用线程,
除了GLIB中的g_thread_init和g_thread_supported两个函数外,还要用到gdk_thread_init来在X
WINDOW中初始化线程应用,另外在线程中要对GTK+控件进行操作时还要在操作前执行函数gdk_thread_enter来进入,操作完成后执行函
数gdk_thread_leave来离开,在执行GTK+主循环时也是如此,GTK+以此来达到线程安全;下面代码利用线程创建了一个在屏幕上沿顺时针
运动的图像(24x24像素):
                       
      
                       
      //thread.c
#include
typedef struct _Ourarg Ourarg;
struct _Ourarg {
        GtkWidget *fixed;
        GtkWidget *image;
        gint right;
        gint left;
};
void        image_go(Ourarg *arg)
{
        gint x, y, toward;
        x = y = arg->left;
        toward = 1;
        for(;;)
        {
                g_usleep(1500);
                gdk_threads_enter();
                gtk_fixed_move(GTK_FIXED(arg->fixed),arg->image, x, y);
                switch(toward)
                {
                case 1:
                        x = x + 10;
                        if( x > arg->right ) toward = 2;
                        break;
                case 2:
                        y = y + 10;
                        if( y > arg->right ) toward = 3;
                        break;
                case 3:
                        x = x - 10;
                        if( x left ) toward = 4;
                        break;
                case 4:
                        y = y -10;
                        if( y left ) toward = 1;
                }
                gdk_threads_leave();
        }
}
int        main(int argc, char* argv[])
{
        GtkWidget *window;
        GtkWidget *vbox, *viewport, *button;
        GtkWidget *image, *fixed;
        Ourarg *arg;
        if(!g_thread_supported()) g_thread_init(NULL);
        gdk_threads_init();
        gtk_init(&argc,&argv);
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(window),"线程测试");
        g_signal_connect(G_OBJECT(window),"delete_event",
                        G_CALLBACK(gtk_main_quit),NULL);
        gtk_container_set_border_width(GTK_CONTAINER(window),2);
        vbox = gtk_vbox_new(FALSE,0);
        gtk_container_add(GTK_CONTAINER(window),vbox);
        fixed = gtk_fixed_new();
        gtk_widget_set_usize(fixed,340,340);
        viewport = gtk_viewport_new(NULL,NULL);
        gtk_box_pack_start(GTK_BOX(vbox),viewport,FALSE,FALSE,5);
        gtk_container_add(GTK_CONTAINER(viewport),fixed);
        image = gtk_image_new_from_file("ss.png");
        gtk_fixed_put(GTK_FIXED(fixed),image,40,40);
        button = gtk_button_new_with_label("退出");
        gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,5);
        g_signal_connect(G_OBJECT(button),"clicked",
                        G_CALLBACK(gtk_main_quit),NULL);
        gtk_widget_show_all(window);
        arg = g_new(Ourarg,1);
        arg->fixed = fixed;
        arg->image = image;
        arg->left = 40;
        arg->right = 260;
        g_thread_create(image_go, arg, FALSE, NULL);
        gdk_threads_enter();
        gtk_main();
        gdk_threads_leave();
        return FALSE;
}
                       
      
基于线程安全考虑,你必须将下面代码放在gtk_init函数之前执行:
                       
      
                       
                      if(!g_thread_supported()) g_thread_init(NULL);
        gdk_threads_init();
       
                       
      
线程中执行一个死循环,不停的移动GtkFixed控件中的图像控件,根据图像的位置来改变方向。
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/48338/showart_490877.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP