Сетевое приложение GTK: нужен шаблон проектирования - PullRequest
1 голос
/ 04 декабря 2011

Я намереваюсь написать сетевое приложение с интерфейсом GUI, предположительно с использованием GTK.

Я совершенно новичок в GTK (и программировании GUI в целом).Моим текущим предположением будет использование двух потоков, один из которых обрабатывает сеть, а другой - с использованием внешнего интерфейса GTK.

Является ли это общим шаблоном проектирования для такого рода проблем, или существуют более эффективные альтернативы, например, обработка сети изв основном цикле GTK?

Если мне нужно прибегнуть к использованию двух потоков, как лучше всего сообщить потоку GTK, что данные доступны из сетевого потока?

Ответы [ 2 ]

2 голосов
/ 04 декабря 2011

Обычный способ GTK + состоит в том, чтобы иметь графический интерфейс пользователя в главном потоке, в то время как медленные операции выполняются в других потоках.Обратите внимание, что если вы хотите обновить графический интерфейс из другого потока, вы должны сделать это внутри блокировки GDK .В документации упоминается, что «с бэкэндом Win32 вызовы GDK вообще не должны выполняться из нескольких потоков», но его можно обойти с помощью g_idle_add , который ставит вызов в очередь в потоке GUI.

Вы можете использовать асинхронные функции GIO (например, g_input_stream_read_async ) для сетевых операций, но ничто не мешает вам использовать универсальную библиотеку потоков, например:

gtk.gdk.threads_init()

...

def on_button_clicked(button):
    label.set_text("Doing something...")
    threading.Thread(target=do_something).start()

def do_something():
    time.sleep(2)
    glib.idle_add(label.set_text, "Done")

Естьнесколько похожий пример использования C (Pthreads) в ранее связанной документации GDK Threads .

1 голос
/ 04 декабря 2011

Первое, на что нужно обратить внимание при программировании GUI, - это шаблон Model View Controller.Вы хотите максимально отделить поток данных от GUI.Сетевой код обновляет модель данных.Когда модель данных изменилась, она сообщает внешнему интерфейсу, чтобы графический интерфейс мог перерисовываться.

...