免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4277 | 回复: 7
打印 上一主题 下一主题

GTK 使用 Pthread 時的問題, 請指教. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-01 15:15 |只看该作者 |倒序浏览
這個就是我的文章. 請各位指教一下. 謝謝.
http://bbs.chinaunix.net/viewthr ... &extra=page%3D1

论坛徽章:
0
2 [报告]
发表于 2006-12-03 01:58 |只看该作者
原帖由 惠繪洋 于 2006-12-1 15:15 发表
這個就是我的文章. 請各位指教一下. 謝謝.
http://bbs.chinaunix.net/viewthr ... &extra=page%3D1


就以前接触的 GTK+ 来讲,现在的 GTK+ 情况就不大清楚了,
好多年没用 GTK+ 了,以下仅作参考:

GTK+ 可以支持多线程,但是所有的事件处理均在主线程中,
也许 GMainLoop 可另外创建循环。

假如你在主线程中

// 创建的线程中调用 gtk_show_widget
(创建线程);

// 即使创建的线程完成工作返回了,
// 但因 GtkWidget 的显示要到下一个事件处理时才动作,所以你看不到结果。
// 解决办法:
// 记住要 gdk_thread_enter()/gdk_thread_leave()
// 要么在创建的线程中使用 gtk_main_iter??? 和 gtk_widget_realize,
// 要么不要在主线程中作此调用。
(等待线程完成并获得返回值);

论坛徽章:
0
3 [报告]
发表于 2006-12-04 11:05 |只看该作者
謝謝savageranthony , 再向你請教.

現在我的程序已經使用了 gdk_thread.

  1. g_thread_init(NULL);
  2. gdk_threads_init();
  3. gdk_threads_enter();

  4. ... ... ...

  5. gtk_main();
  6. gdk_threads_leave();

  7. return 0;
  8. }
复制代码


但當我再次使用 gdk_threads_enter() 及 gdk_threads_leave() 時, 程序顯示就會當了. 程序就的顯示就花了, 但並沒有關閉.
是不是不應該在初 gtk_main 果時使用 gdk_threads_enter() 及 gdk_threads_leave() 呢.
再請你指教. thanks.

论坛徽章:
0
4 [报告]
发表于 2006-12-04 13:51 |只看该作者
原帖由 惠繪洋 于 2006-12-4 11:05 发表
謝謝savageranthony , 再向你請教.

現在我的程序已經使用了 gdk_thread.

  1. g_thread_init(NULL);
  2. gdk_threads_init();
  3. gdk_threads_enter();

  4. ... ... ...

  5. gtk_main();
  6. gdk_threads_leave();
  7. ...
复制代码



在 gtk_signal_connect 指定的信号调用中不能使用 gdk_threads_enter/gdk_threads_leave
因为 gdk_threads_enter/gdk_threads_leave 不能嵌套,所以你的程序会当掉。

用法示例(随手写写,可能有错):


  1. /* 主线程 */
  2. g_thread_init(NULL);
  3. gdk_threads_init(NULL);
  4. gdk_threads_enter();
  5. ...
  6. gtk_signal_connect(GTK_OBJECT(aObject), "something", GTK_SIGNAL_FUNC(aFunc), user_data);
  7. ...
  8. gtk_main();
  9. gdk_threads_leave();


  10. /* 信号调用 */
  11. static void aFunc(GtkWidget *widget, GdkEvent *event, gpointer user_data)
  12. {
  13.    gpointer flag = g_object_get_data(G_OBJECT(widget), "something_for_thread");
  14.    if(flag == NULL)
  15.    {
  16.        ...
  17.        g_thread_create(G_THREAD_FUNC(threadFunc), widget, FALSE, NULL);
  18.        ...
  19.    }
  20.    else
  21.    {
  22.        ....
  23.        g_object_set_data(G_OBJECT(widget), "something_for_thread", NULL);
  24.    }
  25. }


  26. /* 线程调用 */
  27. static void threadFunc(GtkWidget *widget)
  28. {
  29.     gdk_threads_enter();

  30.     if(GTK_WIDGET_MAPPED(widget) == FALSE)  gtk_widget_show(widget);
  31.     if(GTK_WIDGET_REALIZED(widget) == FALSE) gtk_widget_realize(widget);

  32.     ... /* do something */

  33.     /* tell the main loop that I'm finished */
  34.     g_objcet_set_data(G_OBJECT(widget), "something_for_thread", widget);
  35.     gtk_singal_emit_by_name(G_OBJECT(widget), "something", NULL);

  36.     gdk_threads_leave();
  37. }

复制代码

[ 本帖最后由 savageranthony 于 2006-12-4 14:01 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2006-12-04 14:18 |只看该作者
謝謝 savageranthony  的指教.
我再試試看.
想再問你, 你的gtk進階認識是在那學回來的呢. 因為我看過了gtk上的教學, 都沒有這類較為進階的文章. 找了很多google有關thread的, 都沒有類似的介紹..
再一次謝謝你, 若再有問題再向你請教. 謝謝.

论坛徽章:
0
6 [报告]
发表于 2006-12-04 14:54 |只看该作者
原帖由 惠繪洋 于 2006-12-4 14:18 发表
謝謝 savageranthony  的指教.
我再試試看.
想再問你, 你的gtk進階認識是在那學回來的呢. 因為我看過了gtk上的教學, 都沒有這類較為進階的文章. 找了很多google有關thread的, 都沒有類似的介紹..
再一次謝謝 ...


我自己也在写 toolkit。知己知彼

以前用过2年左右的 glib/gtk,
曾经有段时间移植埋在 gnet 上,
这些东西都是那时候鼓捣 gnet 的多线程来的。

论坛徽章:
0
7 [报告]
发表于 2006-12-04 15:10 |只看该作者
原帖由 savageranthony 于 2006-12-4 14:54 发表


我自己也在写 toolkit。知己知彼

以前用过2年左右的 glib/gtk,
曾经有段时间移植埋在 gnet 上,
这些东西都是那时候鼓捣 gnet 的多线程来的。


哦. 明白.
始終都不是太明白 g_object_get_data 等的用法. 睇緊相關的資料.
想再問, 是不是想在 gtk_main 下需要開一個新thread, 都需要用你這個方法呢..

還有, 我另有一個貼, 也是關於gtk的. 也是同一個程序出來的問題, 若你有空能否幫忙看一看, 給我意見. 指教一下呢.
http://bbs.chinaunix.net/viewthr ... &extra=page%3D1

Thanks.

论坛徽章:
0
8 [报告]
发表于 2006-12-04 22:22 |只看该作者
想再問, 是不是想在 gtk_main 下需要開一個新thread, 都需要用你這個方法呢..


无论边种,方法都多种多样,视乎你点根据实际要求去选择啫,
上面只系俾个例子你睇下 gdk_threads_enter/gdk_threads_leave 唔嵌套既情况下点用。

還有, 我另有一個貼, 也是關於gtk的. 也是同一 ...


你最后个段代码无问题。

[ 本帖最后由 savageranthony 于 2006-12-4 22:25 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP