Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C gtk&x2B;win32线程_C_Winapi_Gtk_Pthreads - Fatal编程技术网

C gtk&x2B;win32线程

C gtk&x2B;win32线程,c,winapi,gtk,pthreads,C,Winapi,Gtk,Pthreads,从 对于Win32后端,不应尝试从中调用GDK 多线程 但是如何避免界面冻结呢 例如,我有一个按钮的回调,该按钮从主机获取虚拟机名称,并将其逐行添加到树列表视图中。我创建pthread来执行此操作并添加行 有时列表视图变得杂乱无章(某些单元格变为空白),所有应用程序的行为都相同(所有对话框等) 由于在WIN32中不可能使用多线程,我可以做些什么来模拟它或避免此类问题?仅用于回答此问题: 独立于您用于UI的工具包,这是通过在与UI线程不同的线程中执行计算来实现的。然后使用消息来更新UI,以反映数据

对于Win32后端,不应尝试从中调用GDK 多线程

但是如何避免界面冻结呢

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

有时列表视图变得杂乱无章(某些单元格变为空白),所有应用程序的行为都相同(所有对话框等)


由于在WIN32中不可能使用多线程,我可以做些什么来模拟它或避免此类问题?

仅用于回答此问题:


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

最简单的方法是在您正在执行的过程中执行一个线程,然后从该线程将您想要传递到GUI的任何内容添加到全局容器中。然后调用
g\u idle\u add();空闲回调将从GUI线程调用

需要注意两件事:

  • 在程序初始化过程中调用
    g_thread_init()
    gdk_thread_init()
    ,使glib线程安全
  • 使用互斥锁保护全局容器

  • win32线程是绝对可能的,你不能简单地从多个线程更新UI,这是完全不同的事情。很多时候,我刚开始使用线程。现在我明白了我读到的关于g_idle_add的内容。是的,我明白了。问题是我需要传递一个复杂的数据行。我刚刚开始编写我的第一个多线程应用程序。我希望我能理解,它会起作用的
    But how to avoid freezing of an interface?