| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, 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()? Хотя бы на уровне псевдокода? |