我如何从多个线程中访问GUI(GTK)?

17

我有一个工作线程从GUI中派生出来(为了提高GUI性能),我该如何访问GUI,例如从线程本身生成新的窗口/小部件?

我尝试使用委托,但似乎不起作用。 有什么想法吗? 可能有示例吗? 谢谢。


委托不起作用吗?你是否使用Control.BeginInvoke()方法来调用委托? - Cipi
我不明白,请您详细说明一下? - nubela
5
请记住他正在使用GTK而不是Windows Forms,因此API不同(请见下文)。 - Justin Ethier
1个回答

36
根据他们的最佳实践
Gtk#不是线程安全的工具包,这意味着一次只有一个线程可以安全地调用Gtk#上的方法。通常,这个线程是执行主循环的线程(也就是在控制已经明确转移到Gtk时)。
当应用程序开发人员需要让线程更新图形用户界面的某个元素时,他们必须获取一个锁,允许他们发出Gtk#工具包调用,或者让他们的代码在执行主循环的同一线程上执行。
为了在GTK主循环线程上调用方法并避免任何与线程相关的问题,您可以使用Gtk.Application.Invoke()方法(如果您针对的是Gtk# 1.0,则可以使用Gtk.ThreadNotify)。
提供以下示例;您应该使用Invoke从主循环内部执行任何Gtk代码:
public void ThreadedMethod()
{
    Gtk.Application.Invoke(delegate {
        do_stuff_in_main_thread();
    });
}

2
如何在gtkmm中执行相同的操作? - fnc12
如何使用Gtk.Application.Invoke处理函数返回值? - Vijay Kumbhani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接