2013-01-11 48 views
0

http://developer.gnome.org/gdk/unstable/gdk-Threads.htmlGTK +的Win32线程

使用Win32后台,GDK呼叫不应从 多个线程试图在所有。

但如何避免冻结一个接口?

例如,我有一个按钮的回调函数,它从主机获取虚拟机名称,并将其逐行添加到树列表视图中。我创建pthread并添加行。

有时列表视图成为garbaged(部分细胞变空),之后所有的应用程序的行为相同(所有的对话框等)

如WIN3​​2多线程是不可能的,我能做些什么来模拟它或避免这些问题?

+2

win32线程是绝对有可能的,你不能简单地从多线程更新UI,那完全是另一回事 –

回答

1

最简单的方法就是像你一样做一个线程,并从那里添加你想要传递给GUI的任何东西到全局容器。然后调用g_idle_add()来安排一个读取这个容器并更新GUI的函数;闲置的回调将从GUI线程中调用。

有两件事情需要注意的:

  1. 呼叫g_thread_init()或在你的程序的初始化,使油嘴线程安全gdk_thread_init()
  2. 用互斥锁保护全局容器。
+0

非常感谢,我刚开始使用线程工作。现在我明白我读过关于g_idle_add的内容。 – pugnator

1

只是为了回答这个问题:

But how to avoid freezing of an interface? 
从您正在使用的UI工具包

Indipendently,这是由从UI一个不同的线程执行的计算来实现。然后使用消息更新UI以反映数据中的更改。切勿从与创建窗口的线程不同的线程更新UI。

+0

是的,我明白了。问题是我需要传递一个复杂的数据。我刚开始写我的第一个多线程应用程序。我希望我明白这一切它会工作 – pugnator