LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1651|回复: 7

gtk线程问题

[复制链接]
发表于 2006-12-20 16:33:12 | 显示全部楼层 |阅读模式
#include <gtk/gtk.h>
static GtkWidget *fixed;
static GtkWidget *button1;
static GtkWidget *button2;
void our_thread2 (GtkWidget *button)
{
   gint x,y,towards;
   x=40;
   y=40;
   towards=1;
   for(;;)
   {
     g_usleep(4);
     gdk_threads_enter();
     gtk_fixed_move(GTK_FIXED(fixed),button,x,y);
     switch (towards)
     {
       case 1:
            x=x+10;
            if (x==250) towards =2;
            break;
       case 2:
            y=y+10;
            if(y==250) towards =3;
            break;
       case 3:
            x=x-10;
            if(x==40) towards =4;
            break;
       case 4:
            y=y-10;
            if(y==40) towards =1;
            break;
     }
     gdk_threads_leave();
   }
}

void our_thread1 (GtkWidget *button)
{
   gint i,j,forward;
   i=10;
   j=10;
   forward=1;
   for(;;)
   {
     g_usleep(1);
     gdk_threads_enter();
     gtk_fixed_move(GTK_FIXED(fixed),button,i,j);
     switch (forward)
     {
       case 1:
            i=i+10;
            if (i==290) forward =2;
            break;
       case 2:
            j=j+10;
            if(j==290) forward =3;
            break;
       case 3:
            i=i-10;
            if(i==10) forward =4;
            break;
       case 4:
            j=j-10;
            if(j==10) forward =1;
            break;
     }
     gdk_threads_leave();
   }
}
void on_begin(GtkWidget *button,gpointer data)
{
    gtk_widget_set_sensitive(button,FALSE);
    g_thread_create(our_thread1,button1,FALSE,NULL);
    g_thread_create(our_thread2,button2,FALSE,NULL);
}
int main(int argc,char *argv[])
{
    GtkWidget *window,*view;
    GtkWidget *vbox, *button,*label;
    if(!g_thread_supported())
         g_thread_init(NULL);
    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),10);
    vbox=gtk_vbox_new(FALSE,0);
    gtk_container_add(GTK_CONTAINER(window),vbox);
    label=gtk_label_new("以下是演示程序");
    gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,5);
    view=gtk_viewport_new(NULL,NULL);
    gtk_box_pack_start(GTK_BOX(vbox),view,FALSE,FALSE,5);
   
    fixed=gtk_fixed_new();
    gtk_widget_set_usize(fixed,330,330);
    gtk_container_add(GTK_CONTAINER(view),fixed);
   
    button1=gtk_button_new_with_label("1");
    button2=gtk_button_new_with_label("2");
   
    gtk_fixed_put(GTK_FIXED(fixed),button1,10,10);
    gtk_fixed_put(GTK_FIXED(fixed),button2,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(on_begin),NULL);
    gtk_widget_show_all(window);
    gdk_threads_enter();
    gtk_main();
    gdk_threads_leave();
    return FALSE;
}
 楼主| 发表于 2006-12-20 17:58:25 | 显示全部楼层
能够显示界面 但是按钮不移动。
回复 支持 反对

使用道具 举报

发表于 2006-12-20 18:31:06 | 显示全部楼层
main就是gtk主进程,不用进入thread处理。
去掉gtk_main()上下两行的g_thread_enter和g_thread_leave就行了。
ps: 贴源程序,注意一下格式。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-20 18:40:01 | 显示全部楼层
不好意思。

现在的书质量真是.....
gtk+2.0编程范例 可是国内不多见的一本gtk红宝书呀....错误多多多多...

看来,为了后来人,有必要写一个勘误表。
回复 支持 反对

使用道具 举报

发表于 2006-12-20 18:45:40 | 显示全部楼层
晕,试了一下,原来是忘了gdk_threads_init ()
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-21 20:32:08 | 显示全部楼层
大哥能不能修正一下。
我实在是找不出来。
回复 支持 反对

使用道具 举报

发表于 2006-12-21 22:05:38 | 显示全部楼层
g_usleep是毫秒,1000000=1秒,
多加几个0就成了,原程序改为g_usleep(3000000)和g_usleep(1000000)就可以了。
回复 支持 反对

使用道具 举报

发表于 2006-12-22 08:40:26 | 显示全部楼层
Post by 笨笨3
大哥能不能修正一下。
我实在是找不出来。


gtk_init(&argc,&argv);
前面加上
gdk_threads_init ();
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表