LinuxSir.cn,穿越时空的Linuxsir!

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

GTK+ 如何终止一个子线程

[复制链接]
发表于 2008-6-5 21:56:42 | 显示全部楼层 |阅读模式
就像这个经典的例子
我想再增加一个按钮,单击时让两个子线程都停下来。
我的英文很差,看不动懂官方文档。
http://library.gnome.org/devel/glib/stable/glib-Threads.html
知道答案在这里就是找不到,急啊。
哪位高人指点下啊。

#include <gtk-2.0/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(1*100*1000);
                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*1000*1000);
                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);
        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),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;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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