Сетевое приложение GTK: нужен шаблон проектирования

1

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

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

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

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

Теги:
design
gtk
pygtk

2 ответа

2
Лучший ответ

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

Вы можете использовать функции async 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

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

  • 0
    Звучит интуитивно. Как мне сообщить GTK, что модель данных изменилась?
  • 0
    Смотрите это руководство по созданию пользовательских сигналов в pygtk pygtk.org/articles/subclassing-gobject/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню