现在的位置: 首页 > 综合 > 正文

gtk多线程编程用例

2013年12月03日 ⁄ 综合 ⁄ 共 3148字 ⁄ 字号 评论关闭
#include <gtk/gtk.h> 
static GtkWidget *fixed
static GtkWidget *button1; 
static GtkWidget *button2; 
int running = 1;
void our_thread1(GtkWidget *button) 

 gint x,y,towards; 
 x
=40
 y
=40
 towards
=1
 
while (running)
 

     g_usleep(
1); //一定要加
  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==50) towards=5
  }
 
  gdk_threads_leave();  //搭配上面的
 }
 
}
 

void our_thread2(GtkWidget *button) 

 gint i,j,forward; 
 i
=40
 j
=40
 forward
=1
 
while (running) 
 

  g_usleep(
1); 
  gdk_threads_enter(); 
  gtk_fixed_move(GTK_FIXED(
fixed),button2,i,j); 
  
switch(forward) 
  

  
case 1
   i
=i+10
   
if (i==290) forward=2
   
break
  
case 2
   j
=j+10
   
if (j==250) forward=3
   
break
  
case 3
   i
=i-10
   
if (i==40) forward=4
   
break
  
case 4
   j
=j-10
   
if (j==40) forward=5
  }
 
  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); 
}
 
void *run_f(GtkWidget *butt,gpointer data)
{
    running 
= 0;
}

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),
"thread apllication"); 
     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("Notice! Button is moving"); 
     gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,
0); 
     view
=gtk_viewport_new(NULL,NULL); 
     gtk_box_pack_start(GTK_BOX(vbox),view,FALSE,FALSE,
0); 
     
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("Start"); 
     gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,
5); 
     g_signal_connect(G_OBJECT(button),
"clicked"
          G_CALLBACK(on_begin),NULL);                
// call on_begin
    
     GtkWidget 
*run = gtk_button_new_with_label("stop");
     gtk_box_pack_start(GTK_BOX(vbox),run,FALSE,FALSE,
5); 
     g_signal_connect(G_OBJECT(run),
"clicked"
          G_CALLBACK(run_f),NULL);                
// call on_begin

     gtk_widget_show_all(window); 
     gdk_threads_enter(); 
     gtk_main(); 
     gdk_threads_leave(); 
     
return FALSE; 
}

 Makefile文件:

all: test

test: gthread.c
    gcc 
-o test gthread.c `pkg-config --cflags --libs gtk+-2.0 gthread-2.0`

抱歉!评论已关闭.