Вы столкнулись с проблемой, что у вас есть несколько систем событий одновременно, но только один поток. 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