Как получить доступ к GUI (GTK) из нескольких потоков? - PullRequest
16 голосов
/ 30 марта 2010

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

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

1 Ответ

32 голосов
/ 30 марта 2010

Согласно их рекомендациям :

Gtk # не является потокобезопасным инструментарием, что означает, что только один поток за один раз может безопасно вызывать методы в Gtk #. Этот поток обычно является потоком, выполняющим основной цикл (то есть, когда управление было явно передано Gtk).

Когда разработчикам приложений необходимо обновить потоки какого-либо элемента графического пользовательского интерфейса, им необходимо либо получить блокировку, позволяющую им выполнять вызовы инструментария Gtk #, либо они могут заставить свой код выполняться в том же потоке, что и один поток, который выполняет основной цикл.

Чтобы вызвать метод в потоке основного цикла GTK + и избежать проблем с многопоточностью в GTK, вы можете использовать метод Gtk.Application.Invoke () (если вы используете Gtk # 1.0, вы можете использовать Gtk.ThreadNotify). 1010 *

Предоставлен следующий пример; Вы должны использовать Invoke для выполнения любого кода Gtk из основного цикла:

public void ThreadedMethod()
{
    Gtk.Application.Invoke(delegate {
        do_stuff_in_main_thread();
    });
}
...