|
就像这个经典的例子
我想再增加一个按钮,单击时让两个子线程都停下来。
我的英文很差,看不动懂官方文档。
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;
} |
|