![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
Здравствуйте.
Делаю некий классик, в котором мне нужно реализовать две модели поведения: одну, если класс используется в консольном приложении без цикла обработки сообщений ( типа: while ( true ) { ... } ) и вторую, если класс используется в GUI-приложении, в котором цикл обработки сообщений запущен ( типа: while ( GetMessage(...) ) { PeekMessage + DispatchMessage } ) Собственно вопрос: как мне узнать, запущен ли цикл обработки сообщений или нет. Спасибо. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| YDean |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 7.9.2009 Репутация: 1 Всего: 1 |
GetActiveWindow()
для консоли возвращает ноль |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
YDean, неа. Не работает.
Дело в том, что и в случае консоли и в случае GUI-приложения, мне нужно узнать о потоке обработки сообщений из другого (не оконного - working - потока), чтобы знать, вызывать SendMessage или вызывать некий callback напрямую. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| YDean |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 7.9.2009 Репутация: 1 Всего: 1 |
Непонятно.
Это надо знать на этапе компиляции? В этом случае обычно определена _CONSOLE. А если на этапе выполнения, то анализировать аргумент для SendMessage - (он ведь откуда-то берётся?) |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Кстати, в статье говорится, что эта функция не документированна, но это уже не так - http://msdn.microsoft.com/en-us/library/wi...v=vs.85%29.aspx
Это сообщение отредактировал(а) xvr - 11.10.2012, 13:53 |
||||
|
|||||
| borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
Вау... Замечательно. И даже работает. Проверил. Единственное, что пугает - см. ниже ( в ответе для xvr )
Смущает это
Окну, которое сам создал. Но закручивать самому же цикл обработки сообщений нет никакого желания (особенно, если его уже закрутил какой-нибудь VCL или Qt) В общем, делаю класс GUIMover, который в конструкторе создаёт окно, в обработчике которого дёргается заданный callback, а в функции move делается SendMessage своему окну.
Это сообщение отредактировал(а) borisbn - 11.10.2012, 14:13 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Тогда отправьте сами тестовое сообщение (через SendMessageTimeout). Если не дойдет, то цикла обработки сообщений нет. Это есть. Но это все же лучше, чем полная недокументированность Добавлено через 14 минут и 6 секунд Можно еще попробовать GetMessageTime(). Сравните то, что она вернет с текущим временем (ну и с 0 на всякий случай). Если там разница более нескольких секугд - то цикл обработки сообщений отвалился |
|||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
Уже думал. Делать это каждый раз - глупо - при наличии отсутствия потока обработки будет подвисать на время таймаута. Делать это в конструкторе тоже нельзя, т.к. мой класс могут создать ДО запуска потока приложения. например:
Это сообщение отредактировал(а) borisbn - 11.10.2012, 15:20 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
В общем, решил не заморачиваться, а отдать всё на откуп юзерам... Ну... типа сам виноват, если вообще стал использовать этот класс, не позаботившись о запуске потока обработки сообщений.
Если кому нужно - вот классик с описанием -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Dem_max |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Используй такую конструкцию
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
||||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
тоже "просчитывал"... в приведённом примере:
если в конструкторе SomeWidget запускается поток, который шлёт ему callback'и, то первй вызов GuiMover::move будет ещё без a.exec(), и, соотв., я переключусь в режим прямых callback'ов... Ладно.... мужики... спасибо. Буду заставлять юзеров читать описание... Тем более, что использование этого класса в консоли (!!!) под Windows (!!!) - маловероятно ))) -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Значит наверное алгоритм не правильный. -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |