【问题标题】:How do I access GUI (GTK) from multi threads?如何从多线程访问 GUI (GTK)?
【发布时间】:2010-03-30 19:49:50
【问题描述】:

我有一个从 GUI 产生的工作线程(用于 GUI 性能),我如何访问 GUI,例如从线程本身产生新的窗口/小部件?

我尝试使用委托,但它似乎不起作用。有任何想法吗?可能的例子?谢谢。

【问题讨论】:

  • 代表不工作!?您是否使用 Control.BeginInvoke() 方法来调用委托?
  • 我没有,你能详细说明一下吗?
  • 请记住他使用的是 GTK,而不是 Windows 窗体,因此 API 不同(见下文)。

标签: c# mono gtk gtk#


【解决方案1】:

根据他们的Best Practices

Gtk# 不是一个线程安全的工具包,这意味着一次只有一个线程可以安全地调用 Gtk# 上的方法。该线程通常是执行主循环的线程(此时控制已显式转移到 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();
    });
}

【讨论】:

  • 如何在 gtkmm 中做同样的事情?
  • 如何使用 Gtk.Application.Invoke 处理函数返回值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多