Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [GTK+] Организовать взаимодействие потоков и формы


Автор: Voxifer 12.11.2009, 18:31
Начинаю потихоньку переходить с винды на Linux (в 100500-й раз, ага) и пытаюсь некоторые приемы адаптировать под изменившуюся для меня идеологию. Начал с изучения GTK+, как наиболее приближенной к программированию на WinAPI, на мой взгляд. Прошу небольшой помощи в адаптации.
В своих программах на винде я зачастую использую следующий прием:
1) при запуске приложения запускаются N потоков (возможно, различных, каждый может делать что-то своё), которым параметром передаётся хендл главного окна приложения.
2) Каждый поток при своей работе в момент срабатывания какого-нибудь условия шлет уникальное сообщение с помощью SendMessage\PostMessage.
3) Главная оконная функция приложения получает эти сообщения в порядке живой очереди и в соответствии с параметрами полученных сообщений отображает результаты работы потоков где-нибудь в GUI.

Вопрос, собственно, в следующем: как я понял, системы сообщений здесь нет, её де-факто подменяет система "событий". Как технически можно реализовать вышеприведенный мной приём? Ладно, пусть будет реализовано на событиях, но хотелось быть, чтобы каждому потоку сообщался общий идентификатор и по этому идентификатору поток мог "отсылать" данные, не заботясь об их дальнейшей судьбе.

P.S. Кстати, если у кого-нибудь есть ссылка на книжку по разработке GUI-приложений в GTK - был бы признателен.

Автор: Void 12.11.2009, 18:49
В GLib есть асинхронные очереди (GAsyncQueue). Создать одну или несколько таких очередей, раздать потокам, будут добавлять «события» с помощью g_async_queue_push(). В main loop приложения добавить обработчик g_idle_add() и в нём выбирать сообщения g_async_queue_try_pop().

Автор: Voxifer 12.11.2009, 20:27
Void, это очень ок... Направление примерно понял, через пару часов доберусь до дома - попробую, спасибо. 
Кстати, а есть где-нибудь описание того, что происходит внутри gtk_main()? Хотя бы на уровне псевдокода?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)