![]() |
|
|
![]()
|
|
| Voxifer |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 27.8.2009 Репутация: нет Всего: нет |
Начинаю потихоньку переходить с винды на Linux (в 100500-й раз, ага) и пытаюсь некоторые приемы адаптировать под изменившуюся для меня идеологию. Начал с изучения GTK+, как наиболее приближенной к программированию на WinAPI, на мой взгляд. Прошу небольшой помощи в адаптации.
В своих программах на винде я зачастую использую следующий прием: 1) при запуске приложения запускаются N потоков (возможно, различных, каждый может делать что-то своё), которым параметром передаётся хендл главного окна приложения. 2) Каждый поток при своей работе в момент срабатывания какого-нибудь условия шлет уникальное сообщение с помощью SendMessage\PostMessage. 3) Главная оконная функция приложения получает эти сообщения в порядке живой очереди и в соответствии с параметрами полученных сообщений отображает результаты работы потоков где-нибудь в GUI. Вопрос, собственно, в следующем: как я понял, системы сообщений здесь нет, её де-факто подменяет система "событий". Как технически можно реализовать вышеприведенный мной приём? Ладно, пусть будет реализовано на событиях, но хотелось быть, чтобы каждому потоку сообщался общий идентификатор и по этому идентификатору поток мог "отсылать" данные, не заботясь об их дальнейшей судьбе. P.S. Кстати, если у кого-нибудь есть ссылка на книжку по разработке GUI-приложений в GTK - был бы признателен. |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: нет Всего: 173 |
В GLib есть асинхронные очереди (GAsyncQueue). Создать одну или несколько таких очередей, раздать потокам, будут добавлять «события» с помощью g_async_queue_push(). В main loop приложения добавить обработчик g_idle_add() и в нём выбирать сообщения g_async_queue_try_pop().
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Voxifer |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 27.8.2009 Репутация: нет Всего: нет |
Void, это очень ок... Направление примерно понял, через пару часов доберусь до дома - попробую, спасибо.
Кстати, а есть где-нибудь описание того, что происходит внутри gtk_main()? Хотя бы на уровне псевдокода? |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |