На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Асинхронная актуализация активности кнопок панели pantask (без участия пользователя)

Поиск  Пользователи  Правила  Войти
Форум » Linux » ГИС Панорама для Linux
Страницы: 1
RSS
Асинхронная актуализация активности кнопок панели pantask (без участия пользователя)
 

Добрый день!

Среда проблемы - Astra Linux SE 1.4, ГИС Оператор 11.13.3.

Для pantask-задачи создаю и использую свою панель с кнопками. Как и положено, при обращении в EnableAction определяется активность каждой кнопки с учётом  своего внутреннего состояния; чтобы было понятнее - есть флаг доступности некоего сервера, при наличии которого ряд действий, привязанных к кнопкам, становится доступным.

Нюанс в том, что этот флаг появляется асинхронно, при получении ответа от сервера, а активность кнопок запрашивается ГИСом при перерисовке окна либо при различных пользовательских действиях.

Как следствие, получается некрасивый эффект - задача запускается с неактивными по-умолчанию кнопками (что и логично, т.к. доступность сервера не определена). Далее в какой-то момент асинхронно появляется информация о доступности сервера, выставляется соответствующий флаг, используемый в EnableAction, но пока пользователь что-нибудь не сделает (сдвинет окно ГИС, ткнёт в карту или в меню), кнопки остаются неактивными (т.к. ГИС не обращается в EnableAction). Пользователь, естественно, необходимости таких телодвижений не рад.

Отсюда, собственно, вопрос - как можно программно (без участия пользователя) из pantask-задачи в нужный момент актуализировать активность кнопок своей панели?

Да, чтобы не тратить время на обсуждение моей реализации EnableAction - после того, как пользователь что-нибудь пошевелил и состояние кнопок на экране актуализировалось, последующие переключения состояний, управляемые действиями пользователя, проходят без каких-либо проблем; механизм был давно опробован и обкатан ещё на МСВС. Проблема возникла именно при появлении внешних асинхронных управляющих сигналов.

 
Здравствуйте!

Асинхронный запрос активности обработчика команды можно реализовать с помощью посылки сообщения MT_COMMANDENABLE окну карты:
Код
TPanTask::TCommandEnabler commandEnabler(MYACTION_IDENT); 
MapWindow->SendMessage(MT_COMMANDENABLE, (WPARAM)&commandEnabler);
 
Попробовал так сделать, получил стабильный SIGSEGV:
Цитата
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff6dcf9c2 in TMapManager::OnMessage(int, long, long, long*) () from /usr/Operator11/libmaptask.so.
Пробовал в разных местах - и в конструкторе pantask-задачи, и в обработчике кнопки, и в асинхронном потоке (собственно, целевой вариант). Результат везде один и тот же.
Подумал, что проблема может быть в выпадании объекта commandEnabler из области видимости и, как следствие, его уничтожении - ан нет, передача туда динамически созданного через new объекта приводит ровно к тому же результату.

В описании (если это можно так назвать) MT_COMMANDENABLE упоминается также LPARAM - HINSTANCE. Попытался передавать и его:
Код
MapWindow->SendMessage(MT_COMMANDENABLE, (WPARAM)&commandEnabler, (LPARAM)Hinstance);
Не помогло, результат всё тот же.
Остаюсь в недоумении, что бы это могло быть :)
 
MT_COMMANDENABLE посылается сверху, когда нужно запросить состояние кнопки\пункта меню в задаче. Нет смысла посылать эту команду снизу (из задачи).

Попробуйте отправить:

MainMessage(AW_GETCOMMAND, 0);

Эта команда перезапрашивает состояние всех кнопок и пунктов меню.
 
Извиняюсь за замедленную реакцию, занимался другим проектом.
Попробовал вариант с MainMessage(AW_GETCOMMAND, 0) - эффект тот же, что и без него: пока что-нибудь не сделаю в окне, кнопка активной не становится.
Страницы: 1
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности