LinuxSir.cn,穿越时空的Linuxsir!

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

如何在新线程里使用g_main_loop的例子

[复制链接]
发表于 2009-10-16 14:02:34 | 显示全部楼层 |阅读模式
这个例子是我从Thomas Stover那里改动过来的。
假使源码文件名称为threadloop.c,则使用
gcc threadloop.c -o threadloop `pkg-config --cflags --libs gtk+-2.0 gthread-2.0`编译。
在winxp mingw下运行测试通过。

  1. #include <glib.h>
  2. #include <gtk/gtk.h>

  3. GMainContext *thread1_context = NULL, *thread2_context = NULL;

  4. gboolean timeout_callback(gpointer data)
  5. {
  6.         g_print("timeout_callback()\n");
  7.         return TRUE;
  8. }

  9. gboolean idle_callback(gpointer data)
  10. {
  11.         g_print("idle_callback() in worker thread\n");
  12.         return FALSE;
  13. }

  14. gpointer thread2_entry(gpointer data)
  15. {
  16.         GMainLoop *main_loop;
  17.         GSource *seconds_timeout_source;

  18.         main_loop = g_main_loop_new(thread2_context, FALSE);

  19.         seconds_timeout_source = g_timeout_source_new_seconds(2);
  20.         g_source_set_callback(seconds_timeout_source, timeout_callback, NULL, NULL);
  21.         g_source_attach(seconds_timeout_source, thread2_context);

  22.         g_main_loop_run(main_loop);
  23. }

  24. void button_click(GtkWidget *widget, gpointer data)
  25. {
  26.         GSource *idle_source;

  27.         idle_source = g_idle_source_new();
  28.         g_source_set_callback(idle_source, idle_callback, NULL, NULL);
  29.         g_source_attach(idle_source, thread2_context);
  30. }

  31. gboolean delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
  32. {
  33.         if( thread2_context)
  34.                 g_main_context_unref( thread2_context);
  35.         return FALSE;
  36. }

  37. void destroy(GtkWidget *widget, gpointer data)
  38. {
  39.         gtk_main_quit();
  40. }

  41. int main(int argc, char **argv)
  42. {
  43.         GtkWidget *window;
  44.         GtkWidget *button;
  45.        
  46.         g_thread_init( NULL);
  47.         thread1_context = g_main_context_default();
  48.         thread2_context = g_main_context_new();
  49.        
  50.         gtk_init(&argc, &argv);
  51.         window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

  52.         g_signal_connect( window, "delete-event", G_CALLBACK(delete_event), NULL);

  53.         g_signal_connect( window, "destroy", G_CALLBACK(destroy), NULL);

  54.         gtk_container_set_border_width(GTK_CONTAINER(window), 10);

  55.         button = gtk_button_new_with_label("Idle callback in main thread");

  56.         g_signal_connect( button, "clicked", G_CALLBACK(button_click), NULL);

  57.         gtk_container_add(GTK_CONTAINER(window), button);

  58.         gtk_widget_show_all(window);

  59.         g_thread_create( thread2_entry, NULL, FALSE, NULL);

  60.         gtk_main();
  61.         return 0;
  62. }

复制代码
发表于 2009-11-3 20:19:53 | 显示全部楼层
也看到版主了!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-11-3 23:17:23 | 显示全部楼层
hh_h兄闭关修炼了?
回复 支持 反对

使用道具 举报

发表于 2009-11-6 16:54:39 | 显示全部楼层
Post by realtang;2042381
hh_h兄闭关修炼了?

^_^!哪有!为了生计在辗转奔波。还不是公司让做啥就做啥!已经好久没碰过linux了!
当年我是在几乎完全空白的基础上在linuxsir各位的帮助下起步的,这里对我来说就像一个家。空闲的时候有时候会回来看看,看到各位就倍感情切!
回复 支持 反对

使用道具 举报

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

本版积分规则

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