gtk_main () и unix сокеты - PullRequest
       7

gtk_main () и unix сокеты

4 голосов
/ 12 января 2012

Я работаю над приложением чата с использованием низкоуровневых сокетов C и Unix.Мне удалось создать консольную версию, но я хочу создать графический интерфейс для приложения.Я хотел бы использовать GTK для GUI.Моя проблема заключается в том, как "синхронизировать" сокет и графический интерфейс.потому что я должен вызвать gtk_main () как последний оператор GTK, а само приложение представляет собой бесконечный цикл.Как я могу обновить графический интерфейс, когда приходит сообщение?

1 Ответ

9 голосов
/ 12 января 2012

Вы столкнулись с проблемой, что у вас есть несколько систем событий одновременно, но только один поток. Gtk + поставляется с собственным обработчиком событий, который в конечном итоге сводится к select(), который активируется при любом вводе пользователем или другом событии gtk. Вы сами хотите управлять сетью с помощью собственной обработки событий, которая обычно состоит из select() на ваших сокетах или использования сокетов в режиме блокировки.

Одним из решений является интеграция ваших событий в цикл обработки событий Gtk +.

Вы можете сделать Gtk + watch / select() вашими сокетами и вызывать определенную функцию при изменении их состояния (чтение данных). См. Раздел «Создание новых типов источников» на http://developer.gnome.org/glib/2.30/glib-The-Main-Event-Loop.html

Другим решением было бы использование сетевых функций Gtk +.

Как правило, вы не хотите делать что-то настолько особенное с сокетами, что его нелегко обернуть с помощью каналов Glib IO. См http://developer.gnome.org/glib/2.30/glib-IO-Channels.html

Третье решение заключается в запуске второго потока, который управляет вашей сетью, например, с потоками posix или функциональностью Gtk + threading.

Отделение графического интерфейса пользователя от рабочей части вашего приложения в целом является хорошей идеей. Однако для приложения чата это, вероятно, не дает никакой выгоды по сравнению с другими решениями. Смотри http://developer.gnome.org/glib/2.30/glib-Threads.html

...