【转】gtk+多线程的程序实例

  • 时间:
  • 浏览:0
  • 来源:大发彩神苹果下载_大发神彩苹果下载官方

static GtkWidget *fixed;

{

     button1=gtk_button_new_with_label("1");

              gdk_threads_leave();

}

int main( int   argc,

  {

    gdk_threads_enter();

gint test()

       };

    /*当按钮收到"clicked"信 号都是调用hello()函数,并将NULL传给

     gtk_widget_show_all(window);

    gtk_main_quit ();

    /*把按钮倒入窗口(另哪多少gtk容器)中。*/

/*那末 回调函数*/

    /*改TRUE为FALSE任务管理器会关闭。*/

   break;

     GtkWidget *vbox,*button,*label;

  gdk_threads_leave();  //搭配上边的

{

int main(int argc,char* argv[])

}

     *选项或是标题栏上的关闭按钮发出的),其他同学 让它调用在前面定义的delete_event()函数。

   if (y==260 ) towards=3;

    /*机会你的"delete_event"信号正确处理函数返回FALSE,GTK会发出"destroy"信号。

              g_printf("hello\n");

     gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,5);

{

     fixed=gtk_fixed_new(); 

static GtkWidget *button2;

  gtk_fixed_move(GTK_FIXED(fixed),button,x,y); 

       if(!g_thread_supported()) g_thread_init(NULL);

*上边有更多的回调函数示例。*/

     gtk_init(&argc,&argv);

    return 0;

     view=gtk_viewport_new(NULL,NULL);

    return TRUE;

     *都是触发有一种事件。*/

    /*当窗口收到"delete_event"信号(有一种信号由窗口管理器发出,通常是“关闭”

  gdk_threads_enter(); //在时需与图形窗口交互的如果加

/*这是另哪多少回调函数。data参数在本示例中被忽略。

     gdk_threads_init();

}

   y=y-10;

gint timeout_callback( gpointer data )

 while (running)

     *它作为参数。hello()函数 在前面定义了。*/

                    G_CALLBACK (destroy), NULL);

 x=40;

          G_CALLBACK(on_begin),NULL);                // call on_begin

    g_signal_connect (G_OBJECT (button), "clicked",

          char *argv[] )

     gtk_main();

                    G_CALLBACK (hello), NULL);

    while(1)

网上各种文章都强烈建议,所有对于GUI的操作都是另哪多少任务管理器内完成,过多过多机会愿因分析阻塞的工作在另外另哪多少任务管理器中。

过多过多过多过多有

   x=x+10;

{

2.将同步操作异步化。其他同学 知道在GTK+中,它使用glib的signal作为窗口/控件之间的通信法律辦法 ,signal的执行是直接调用函数,即整个signal的执行过程是同步完成的。这在多数情況下工作得很好,但有都是出現重入的问题,你调我,我再调你,可 能会遇到麻烦。此时其他同学 不得不采用异步法律辦法 ,而GTK+那末 提供像Win32下的PostMessage类似于的异 步消息,幸好其他同学 都时需用g_idle_add函数来模拟。

static GtkWidget *button1;

}

    g_signal_connect (G_OBJECT (window), "delete_event",

     GtkWidget *run = gtk_button_new_with_label("stop");

    /*所有的GTK任务管理器时需有一 个gtk_main()函数。任务管理器运行停在这里

       g_thread_create(test, NULL, FALSE, NULL);

    /*创建另哪多少新窗口*/

    gtk_widget_show (button);

   x=x-10;

     g_usleep(1); //一定要加

     GtkWidget *window,*view;

     gtk_container_add(GTK_CONTAINER(view),fixed);

void *run_f(GtkWidget *butt,gpointer data)

     *对有一种窗口调用gtk_widget_destroy()函数或在"delete_event"回调函数中返回FALSE值

}

 {

     gtk_box_pack_start(GTK_BOX(vbox),run,FALSE,FALSE,5);

   break;

void our_thread1(GtkWidget *button)

     g_thread_create(our_thread1,button1,FALSE,NULL); 

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

{

   y=y+10;

     gtk_fixed_put(GTK_FIXED(fixed),button1,10,10); 

void destroy( GtkWidget *widget,

    /*当点击按钮时,会通过调用gtk_widget_destroy(window)来关闭窗口。

          G_CALLBACK(gtk_main_quit),NULL);

     return FALSE;

     gdk_threads_leave();

                              window);

     if (!g_thread_supported())

{

{

     gtk_box_pack_start(GTK_BOX(vbox),view,FALSE,FALSE,0);

    gtk_container_add (GTK_CONTAINER (window), button);

    g_print ("Hello World\n");

     vbox=gtk_vbox_new(FALSE,0);

     gtk_container_add(GTK_CONTAINER(window),vbox);

   if (x==260 ) towards=2;

{

     button=gtk_button_new_with_label("Start");

其他同学 知道glib提供了另哪多少名为g_idle_add的 函数,有一种函数的功能很容易理解:增加另哪多少空闲任务,让应用任务管理器在空闲时执行指定的函数。 有一种机制非常有用,机会那末 有一种机制,过多过多过多过多有事情将非常麻烦。它的功能虽然简单,但并都是该人都知道怎么才能 才能 充分派挥它的潜力,这里得话它的哪多少主要用途吧。

    g_print ("delete event occurred\n");

                   GdkEvent *event,

}

gint delete_event( GtkWidget *widget,

}

    gtk_init (&argc, &argv);

     window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

            gpointer   data )

       gdk_threads_init();

  switch(towards)

     gtk_container_set_border_width(GTK_CONTAINER(window),10);

#include <gtk/gtk.h>

}

     *停留事件(如键盘事件或鼠标 事件)的发生。*/

    GtkWidget *button;

 y=40;

void on_begin(GtkWidget* button,gpointer data)

     label=gtk_label_new("Notice! Button is moving");

#include <gtk/gtk.h>

     gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0);

    /*最后一步是显示新创建的按钮和窗口*/

                           G_CALLBACK (gtk_widget_destroy),

    gtk_timeout_add(1, timeout_callback, NULL);

                 gpointer   data )

int running = 1;

     gtk_window_set_title(GTK_WINDOW(window),"thread apllication");

  case 1:

     *当你想弹出“你确定 要退出吗?”对话框时它很有用。*/

3.串行化对GUI的访问。在大 多数平台下,对GUI资源的访问都是时需串行化的,即在另哪多少GUI应用任务管理器中,不到另哪多少任务管理器都时需直接操作GUI资源。这是机会出于速率单位的考虑,GUI资源是那末 加锁保护的,GTK+也是那末 的。机会另外另哪多少任务管理器要访问GUI资源,比如要显示第四根信息,为社 办 办呢?这都时需通过g_idle_add增加另哪多少空闲任务来实现,idle任务是GUI任务管理器(主任务管理器)中执行的,过多过多过多过多有串行了对GUI资源的访问。

    g_signal_connect_swapped (G_OBJECT (button), "clicked",

     gtk_widget_set_sensitive(button,FALSE);

    return TRUE;

{

          G_CALLBACK(run_f),NULL);                // call on_begin

1.在空闲时执行低优先级任务。有的任务优先级比较低,但费耗时间比较长,像屏幕刷新等操作,其他同学 不希望它阻碍当前操作过多,此时 都时需把它倒入空闲任务里去做。实际上GTK+上边也是那末 做的,那末 都时需获得 更好的响应性。

     gdk_threads_enter();

       {

gboolean on_finish(gpointer wbus)

   if (x==40) towards=4;

     g_signal_connect(G_OBJECT(window),"delete_event",

   if (y==60 ) towards=5;

 gint x,y,towards;

     *传给回调函数的data参数值是NULL,它会被回调函数忽略。*/

}

              gdk_threads_enter();

                    G_CALLBACK (delete_event), NULL);

  }

     g_signal_connect(G_OBJECT(button),"clicked",

    /*在这里其他同学 连接"destroy"事 件到另哪多少信号正确处理函数。

     gtk_widget_set_usize(fixed,360 ,360 ); 

  case 3:

    button = gtk_button_new_with_label ("Hello World");

{

  case 2:

    g_signal_connect (G_OBJECT (window), "destroy",

    gtk_widget_show (window);

}

    GtkWidget *window;

    /* GtkWidget是构件的存储类型*/

 }

    gdk_threads_leave();    

       return FALSE;

  case 4:

     g_signal_connect(G_OBJECT(run),"clicked",

      g_thread_init(NULL);

     * "destroy"信号会从这里或从窗口管理器发出。*/

              gpointer   data )

    /*创建另哪多少标签为"Hello World"的新按钮。*/

void hello( GtkWidget *widget,

     *返回TRUE,你不希望关闭窗口。

       /*有一种函数在所有的GTK任务管理器都是调 用。参数由命令行中解融化来过多过多送到该任务管理器中*/

 towards=1;

   break;

这里要注意,idle任务并都是另哪多少独立的任务管理器机会任务管理器,而在是主任务管理器中执行的。所谓空闲是指,当main loop那末 其它消息要正确处理,过多过多那末 更高优先级的工作要做时,就认为发生空闲情況。

    gtk_main ();

    running = 0;