Как получить доступ к GUI (GTK) из нескольких потоков?

У меня есть рабочий поток, порожденный графическим интерфейсом (для производительности графического интерфейса пользователя), как мне получить доступ к графическому интерфейсу, например, создавать новые окна/виджеты из самого потока?

Я пытался использовать делегатов, но он, похоже, не работает. Есть идеи? Возможно, примеры? Спасибо.

Ответ 1

В соответствии с их Best Practices:

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();
    });
}