0

来自http://developer.gnome.org/gdk/unstable/gdk-Threads.html

使用 Win32 后端,根本不应尝试从多个线程调用 GDK。

但是如何避免界面冻结呢?

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

有时列表视图变成垃圾(一些单元格变成空白),之后所有应用程序的行为都相同(所有对话框等)

由于在 WIN32 中多线程是不可能的,我该怎么做才能模拟它或避免此类问题?

4

2 回答 2

1

只是为了回答这个问题:

But how to avoid freezing of an interface?

独立于您用于 UI 的工具包,这是通过在与 UI 线程不同的线程中进行计算来实现的。然后通过使用消息来更新 UI 以反映数据中的更改。切勿从与创建窗口的线程不同的线程更新 UI。

于 2013-01-11T16:51:52.030 回答
1

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

有两点需要注意:

  1. 在程序的初始化中调用g_thread_init()gdk_thread_init()使 glib 线程安全。
  2. 使用互斥锁保护全局容器。
于 2013-01-11T16:52:19.327 回答