Официальный форум СВД Встраиваемые Системы
04 Декабря, 2016, 09:01:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Изменение свойств региона QNX4  (Прочитано 1175 раз)
zpt
Интересующийся

Сообщений: 7


« : 01 Июля, 2014, 17:35:45 »

OC QNX4.25

Имеются два примера функций реализующие одно и тоже - установка региону свойства непрозрачности прохождения событий нажатия клавиатуры.
Пример 1 - не работает, пример 2 работает! Объясните почему не работает пример 1, что делаю неправильно.
Заранее благодарен.

//пример 1
void sig_user_handler( int hd )
{
   if ( pRegion != NULL ) {
      PtArg_t    args[10];
      u_long opaque = 0;
      int i = 0;

      PtSetArg(&args[i++], Pt_ARG_REGION_FIELDS, Ph_REGION_EV_OPAQUE, Ph_REGION_EV_OPAQUE );
   
      opaque = hd == SIGUSR1 ? Ph_EV_KEY : 0;
   
      PtSetArg(&args[i++], Pt_ARG_REGION_OPAQUE, opaque, Pt_TRUE );
   
      PtSetResources( pRegion, i, args );
   }
}

//пример 2
void sig_user_handler( int hd )
{
   if ( pRegion != NULL ) {
      PhRegion_t region;
      PhRect_t rect;

      PhRegionQuery( PtWidgetRid( pRegion ), &region, &rect, NULL, 0 );

      region.events_opaque = hd == SIGUSR1 ? 1 : 0;

      PhRegionChange( Ph_REGION_EV_OPAQUE, Ph_EXPOSE_REGION, &region, NULL, NULL );
   }

}
Записан
Андрей Панченко
Сотрудник СВД ВС
Пользователь

Сообщений: 76



WWW
« Ответ #1 : 03 Июля, 2014, 11:18:54 »

Свойства региона должны устанавливаться через функцию PhRegionChange();
Записан

Сотрудник СВД Встраиваемые Системы
zpt
Интересующийся

Сообщений: 7


« Ответ #2 : 03 Июля, 2014, 19:57:07 »

Однако, цвет заливки региона установить можно через PtSetResources()!
Записан
Андрей Панченко
Сотрудник СВД ВС
Пользователь

Сообщений: 76



WWW
« Ответ #3 : 03 Июля, 2014, 21:45:39 »

Свойство Pt_ARG_FILL_COLOR, как и многие другие свойства общие для виджетов, наследуется от PtWidget и PtBasic
Записан

Сотрудник СВД Встраиваемые Системы
zpt
Интересующийся

Сообщений: 7


« Ответ #4 : 05 Июля, 2014, 05:14:33 »

Спасибо, понял!
Записан
Андрей Панченко
Сотрудник СВД ВС
Пользователь

Сообщений: 76



WWW
« Ответ #5 : 05 Июля, 2014, 12:12:43 »

К сожалению, я ввёл вас в заблуждение. Свойства региона можно изменить через установку свойств связанного с ним виджета PtRegion. Виджет сам вызывает функцию PhRegionChange() при своей реинициализации.

Я подправил установку свойств в PtSetArg, так как ваш вариант мне кажется не совсем корректен. Также важно вызвать после PtSetResources() функцию PtReRealizeWidget() для реинициализации, это особенность данного виджета.

Примерный код должен выглядеть так:
Код:
if ( pRegion != NULL ) {
      PtArg_t    args[10];
      long opaque = 0;
      int i = 0;

      PtSetArg(&args[i++], Pt_ARG_REGION_FIELDS, Pt_TRUE, Ph_REGION_EV_OPAQUE );
  
      opaque = hd == SIGUSR1 ? Pt_TRUE : Pt_FALSE;
  
      PtSetArg(&args[i++], Pt_ARG_REGION_OPAQUE, opaque, Ph_EV_KEY );
  
      PtSetResources( pRegion, i, args );
      PtReRealizeWidget( pRegion );
   }

Насколько я понимаю sig_user_handler() - обработчик сигналов. В этом случает вызывать в нём функции виджетов небезопасно, так как библиотека виджетов не сигналобезопасна и  не реентерабельна.
Обойти это можно с помощью специального обработчика сигналов Photon, который синхронизируется с библиотекой виджетов.

Примерный код:
Код:
int sig_user_handler (int signum, void *data)
{
    ...
    // работа с виджетами
    ...
    return (  Pt_CONTINUE );
}
...
main()
{
    sigset_t set;
    ...
    // Инициализация библиотеки виджетов
    ...
    sigemptyset( &set );
    sigaddset( &set, SIGUSR1 );
    sigaddset( &set, SIGUSR2 );
    PtAppAddSignalProc( NULL, &set, sig_user_handler, NULL );
}
« Последнее редактирование: 06 Июля, 2014, 20:04:28 от Андрей Панченко » Записан

Сотрудник СВД Встраиваемые Системы
zpt
Интересующийся

Сообщений: 7


« Ответ #6 : 09 Июля, 2014, 20:45:13 »

Большое спасибо за подробный ответ.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP © 2002-2016 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на forum.kpda.ru обязательна.

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines | © Aiwan. Kolobok smiles | Sitemap
Valid XHTML 1.0! Valid CSS!
Сайт СВД ВС

В последний раз google посещал эту страницу 22 Октября, 2016, 15:20:38