如何从多线程访问GUI(GTK)?
问题描述:
我有一个从GUI生成的工作线程(用于GUI性能),我如何访问GUI,例如从线程本身产生新的窗口/小部件?如何从多线程访问GUI(GTK)?
我尝试使用代表,但它似乎并没有工作。有任何想法吗?可能的例子?谢谢。
答
根据他们Best Practices:
Gtk#的是不是线程安全的工具包,这意味着只有一次一个线程可以安全地调用上Gtk#的方法。这个线程通常是执行主循环的线程(当控制被明确地转移到Gtk时)。
当应用程序开发人员需要让线程更新图形用户界面的某个元素时,他们必须获得一个允许他们发出Gtk#toolkit调用的锁,或者他们可以让他们的代码在一个线程的同一线程上执行执行主循环。你可以使用Gtk.Application.Invoke()方法(如果你的目标是Gtk#1.0,你可以使用Gtk.ThreadNotify)。为了在GTK +主循环线程上调用一个方法并避免任何GTK的线程问题,你可以使用Gtk.Application.Invoke()方法。
提供以下示例;您应该使用Invoke
来执行主循环内的任何Gtk代码:
public void ThreadedMethod()
{
Gtk.Application.Invoke(delegate {
do_stuff_in_main_thread();
});
}
代表不工作!?你使用Control.BeginInvoke()方法来调用委托吗? – Cipi 2010-03-30 19:54:42
我没有,你能详细说明一下吗? – nubela 2010-03-30 19:57:22
请记住他正在使用GTK,而不是Windows窗体,所以API是不同的(见下文)。 – 2010-03-30 20:00:11