Главная » Просмотр файлов » Руководство программиста в Photon

Руководство программиста в Photon (1037671), страница 43

Файл №1037671 Руководство программиста в Photon (Раздаточные материалы) 43 страницаРуководство программиста в Photon (1037671) страница 432017-12-25СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 43)

pid_t pulse;

/* Строка опций приложения */

const char ApOptions[] = AB_OPTIONS ""; /* Добавьте Ваши опции в "" */

int init( int argc, char *argv[] ) {

if (( pulse = PtAppCreatePulse( NULL, -1 ) ) = = 0

|| PtAppAddInput( NULL, pulse, input_fun, NULL ) = = NULL ) {

fputs( "Инициализация не удалась\n", stderr );

exit( EXIT_FAILURE );

}

PtPulseArm( NULL, pulse, &sigev );

/* предотвращает предупреждения (варнинги) об отсутствии ссылок */

argc = argc, argv = argv;

return( Pt_CONTINUE );

} // Функции init()

int open_queue( PtWidget_t *link_instance, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo ) {

const char *name;

PtArg_t arg;

if ( mqd >= 0 ) mq_close( mqd );

PtSetArg( &arg, Pt_ARG_TEXT_STRING, &name, 0 );

PtGetResources( ABW_qname, 1, &arg );

if ( ( mqd = mq_open( name, O_RDONLY | O_CREAT | O_NONBLOCK, S_IRUSR | S_IWUSR,

NULL ) ) < 0 )

perror( name );

else

if ( mq_notify( mqd, &sigev ) == -1 ) {

perror( "mq_notify" );

mq_close( mqd );

mqd = -1;

}

else

readqueue();

/* предотвращает предупреждения (варнинги) об отсутствии ссылок */

link_instance = link_instance, apinfo = apinfo;

cbinfo = cbinfo;

return( Pt_CONTINUE );

} // Функции open_queue()

Приложение Photon, отправляющее импульсы

Приложение Photon'а, собирающееся отправлять импульсы, должно:

  • Иметь обработчик ввода для сообщений от того приложения, которое собирается получать эти импульсы. Этот обработчик ввода создаётся так, как описано ранее в разделе "Получение сообщений QNX" этой главы. Ему необходимо обрабатывать сообщения, содержащие сообщение импульса, и сообщения, указывающие ему прекратить выдачу импульсов.

Сохраните rcvid из сообщения, которое содержит сообщение импульса – этот идентификатор получателя понадобится Вам при отправке импульса.

  • Отправлять импульсы, вызывая функцию MsgDeliverEvent().

Обработка сигналов

Если Вашему приложению необходимо обрабатывать сигналы, Вам понадобится установить обработчик сигналов. Проблема заключается в том. что Вы не можете вызвать функции Photon'а из обработчика сигнала, поскольку библиотека виджетов не является сигнало-безопасной или рентабельной (повторно входимой).

Чтобы обойти эту проблему, библиотека Photon'а включает обработчик сигнала. Вы регистрируете функцию обработки сигнала, и Photon вызывает её после того, как

  • Photon'овский обработчик сигнала вернул управление

и

  • завершилась вся обработка текущего виджета.

Обрабатывая сигналы таким способом, Вы не получаете строгой производительности реального времени, поскольку Ваша функция обработки сигнала не вызывается немедленно, тотчас.

Добавление функции обработки сигналов

Чтобы добавить функцию обработки сигнала, используйте функцию PtAppAddSignalProc(). Обычно Вы будете вызывать её в

  • инициализирующей функции Вашего приложения

или

  • установочной функции для окна.

Вам понадобится подключить хеадер <signal.h>. Синтаксис функции ptAppAddSignalProc() следующий:

int PtAppAddSignalProc( PtAppContext_t app,

sigset_t const *set,

PtSignalProc_t func,

void *data);

где аргументы следующие:

app Адрес контекста приложения, структуры типа PtAppContext_t, управляющей всеми данными, связанными с этим приложением. Задайте NULL в качестве этого аргумента, так чтобы использовался контекст по умолчанию.

set Указатель на набор сигналов, которые должны служить причиной вызова функции обработки сигналов. Для компоновки этого набора используйте функции sigemptyset() и sigaddset(). Более подробно см. в "Справочнике библиотечных функций QNX 6".

func Функция обработки сигналов. См. описание PtSignalProc_t в "Справочнике библиотечных функций Photon'а".

data Любые данные, передаваемые функции

Функция PtAppAddSignalProc() возвращает 0 в случае успеха или –1, если случается ошибка.

Ваша функция обработки сигнала имеет следующий прототип:

int signalProcFunctions(int signum, void *data);

аргументами являются:

signum Номер обрабатываемого сигнала

data Параметр data, заданный в вызове функции PtAppAddSignalProc().

Если Вы хотите, чтобы обработчик сигнала остался установленным, верните Pt_CONTINUE. Чтобы удалить его для текущего сигнала, верните Pt_END (если функция была зарегистрирована и для других сигналов, она по-прежнему будет вызываться, если те появятся).

Удаление функции обработки сигналов

Чтобы удалить функцию обработки сигнала:

  • Вызовите функцию PtAppRemoveSignal(), чтобы удалить одну или все наличествующие пары (функция обработки сигналов, данные).

  • Верните Pt_END функцией обработки сигнала. Если функция была зарегистрирована для более чем одного сигнала, она останется установленной для остальных сигналов, кроме того, который как раз обрабатывался.

Другие механизмы ввода/вывода

Если Вашему приложению необходимо выполнить ввод/вывод, такие как чтение или запись в трубопровод, Вы должны добавить обработчик файлового дескриптора (fd handler). Обработчик файлового дескриптора – это функция, вызываемая в главной петле событий, когда заданный файловый дескриптор (fd) готов к вводу или выводу:

  • Чтобы добавить обработчик файлового дескриптора в Ваше приложение, вызовите функцию PtAppAddFd() или PtAppAddFdPri().

  • Подробности о прототипе обработчика файлового дескриптора см. в описании PtFdProc_t в "Справочнике библиотечных функций Photon'а"

  • Чтобы изменить режим, являющийся сферой интересов обработчика файлового дескриптора, вызовите функцию PtAppSetFdMode().

  • Чтобы удалить обработчик файлового дескриптора, верните из него Pt_END или вызовите функцию PtAppRemoveFd().

Эти функции описаны в "Справочнике библиотечных функций Photon'а".

 Если обработчик файлового дескриптора изменяет изображение, он должен вызвать функцию PtFlush(), чтобы гарантировать обновление изображения.

Глава 17. Параллельные операции

В этой главе обсуждатся:

  • Обзор

  • Потоки

  • Рабочие процедуры

  • Фоновое исполнение

Обзор

Когда Вы выполняете операцию, отнимающую на исполнение много времени, выполнять её как простую ответную реукцию является не лучшей идеей. Во время исполнения ответной реакции виджеты Вашего приложения не будут восстанавливать свои повреждения и совсем не будут откликаться на действия пользователя. Вам необходимо разработать стратегию обработки очень длинных операций внутри внутри Вашего приложения, так чтобы возвращать управление из Вашей ответной реакции как можно скорее.

Возврат управления из Вашей ответной реакции позволяет виджетам продолжить визуальное самообновление. Это также даёт некую визуальную обратную связь с пользователем, когда тот попытается что-то сделать. Если Вы не хотите, чтобы пользователь мог выполнить в это время какую-либо операцию пользовательского интерфейса, Вы должны деактивировать меню и кнопки команд. Вы можете сделать это установкой флага Pt_BLOCKED в ресурсе Pt_ARG_FLAGS виджетов окна приложения.

При распараллеливании операций Вы можете рассмотреть применение одного из нескольких различных механизмов:

  • Если Вы не можете разбить операцию на отдельные части, обрабатывайте событитие Photon'а во время выполнения операции; См. раздел "Фоновое исполнение" ниже.

  • Если Вы можете разбить операцию на маленькие куски программы, Вы можете захотеть иметь функцию, которая отслеживает текущее состояние и исполняет один маленький кусок операции за раз. Вы можете затем установить виджет таймера и подсоединить его к ответной реакции, которая бы вызывала функцию каждый раз, когда таймер бы срабатывал. Или же Вы можете вызывать функцию из так называемой рабочей процедуры. Эти методы особенно эффективны для многократно повторяющихся опреаций, когда функция может быть исполнена один раз в итерации. См. раздел "Рабочие процедуры" ниже.

  • Используйте множественные кнопки. Это требует определённой специфической обработки, поскольку библиотеки Photom'а не являются потокобезопасными (thread-safe); см. раздел "Потоки" ниже.

  • Породите в ответной реакции другой процесс, и пусть имеется другой процесс, возвращающий результаты первого процесса приложению путём отсылки его сообщений. В этом случае очень важно быть в состоянии отслеживать протекание операции и давать пользователю визуальную обратную связь.

Фоновое исполнение

Если очень длительная операция не может быть легко разбита на отдельные части, и Вы не хотите использовать несколько потоков, Вы должны по меньшей мере вызвать функцию PtBkgdHandlerProcess() для обработки событий Photon'а, так чтобы графический интерфейс пользователя не выглядел бы замороженным.

Если операция ну очень длительная, Вы можете вызвать PtBkgdHandlerProcess() внутри петли. Как часто Вам надо вызывать функцию PtBkgdHandlerProcess(), зависит от того, что делает Ваше приложение. Вы должны также найти способ, позволяющий пользователю знать, в каком состоянии ход исполнения операции.

Например, если Вы читаете большую директорию, Вы можете вызывать фоновый обработчик после чтения нескольких файлов. Если Вы открываете и обрабатываете каждый файл в директории, Вы должны вызывать PtBkgdHandlerProcess() после каждого файла.

 Безопасным является вызов функции PtBkgdHandlerProcess() в ответных реакциях, рабочих процедурах и процедурах ввода, но отнюдь не в "Draw"-методе виджета (см. книгу "Проектирование своих виджетов" или в функции прорисовки PtRaw).

Если ответная реакция вызывает функцию PtBkgdHandlerProcess(), будьте осторожны, если можете вызвать ответную реакцию одновременно несколько раз. Если Вы не хотите обрабатывать эту рекурсию, то должны блокировать виджет(ы), связанный(ые) с ответной реакцией.

События Photon'а обрабатываются следующими функциями:

  • PtBkgdHandlerProcess()

  • PtFileSelection()

  • PtProcessEvent()

  • PtSpawnWait()

Рабочие процедуры

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

 Если Ваше рабочая процедура изменяет изображение, вызывайте функцию PtFlush(), чтобы гарантировать обновление изображения.

См. раздел "Потоки и рабочие процедуры" ниже, если Вы пишете рабочую процедуру для многопоточной программы.

Рабочие процедуры собираются в стек; когда Вы регистрируете рабочую процедуру, она помещается наверх стека. Вызывается только рабочая процедура, расположенная в вершине стека. Если вы удаляете рабочую процедуру, находящуюся в вершине стека, вызывается эта, что расположена сразу под ней.

Рабочая процедура сама по себе является функцией ответной реакции, получающей единственный void* параметр – client_data. Этот параметр client_data представляет собой данные [вернее, указатель на данные. – Прим. пер.], которые Вы присоединяете к рабочей процедуре, когда регистрируете её в библиотеке виджета. Вы должны создать структуру данных для рабочей процедуры, которая содержит вся её информацию о состоянии, и предоставить её как client_data.

Чтобы зарегистрировать, или добавить, рабочую процедуру, вызовите функциюPtAppAddWorkProc():

PtWorkProcId_t * PtAppAddWorkProc( PtAppContext_t app_context,

PtWorkProc_t work_func,

void *data );

параметрами которой являются:

  • app_context – адрес контекста приложения, структура типа PtAppContext_t, которая управляет всеми данными, присоединёнными к этому приложению. Этот параметр должен быть задан как NULL, так чтобы использовался контекст по умолчанию.

  • work_func – адрес функция ответной реакции – рабочая процедура. См. описание PtWorkProc_t в "Справочнике библиотечных функций Photon'а".

  • client_data – данные, передаваемые функции при её вызове.

PtAppAddWorkProc() возвращает указатель на структуру типа PtWorkProcId_t, которая идентифицирует рабочую процедуру. Чтобы удалить рабочую процедуру, когда она уже больше не нужна, вызывайте PtAppRemoveWorkProc():

void PtAppRemoveWorkProc( PtAppContext_t app_context,

Характеристики

Тип файла
Документ
Размер
7,62 Mb
Тип материала
Высшее учебное заведение

Список файлов учебной работы

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6381
Авторов
на СтудИзбе
308
Средний доход
с одного платного файла
Обучение Подробнее