Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Литература_1 / photon_old.doc
Скачиваний:
38
Добавлен:
02.04.2015
Размер:
7.88 Mб
Скачать
          1. Приложение Photon'а, получающее импульсы

Это адресат импульсов Photon'а, который делает большую часть подготовительной работы. Ему следует

  1. Создать импульс

  2. Взвести импульс

  3. Отослать сообщение об импульсе процессу, который будет этот импульс испускать

  4. Зарегистрировать обработчик ввода для сообщений импульса

  5. Послать импульс самому себе, если это необходимо

  6. Удалить импульс, когда он больше не будет нужен

В нижеприведенных разделах обсуждается каждый шаг, и далее следует пример.

 Перед своим завершением процесс-получатель импульсов должен дать указание процессу, посылающему импульсы, перестать это делать.

          1. Создание импульса

Чтобы создать импульс Photon'а, вызовите функцию PtAppCreatePulse():

pid_t PtAppCreatePulse(PtAppContext_t app, int priority);

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

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

priority приоритет импульса. Если он равен –1, используется приоритет вызывающей программы.

PtAppCreatePulse() возвращает идентификатор импульса, который является отрицательным числом, но никогда не равен –1. Это конец импульса на стороне получателя.

          1. Взведение импульса

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

 Нет никакой ошибки в том, чтобы иметь больше одного процесса-источника одного и того же импульса, несмотря на то, что получатель не будет в состоянии определить, какой процесс его послал.

Чтобы взвести импульс, вызовите функцию PtPulseArm(). Её прототип:

int PtPulseArm( PtAppContext_t app, pid_t pulse, struct sigevent *msg );

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

app Указатель на PtAppContext_t структуру, определяющую текущий контекст приложения (обычно NULL)

pulse Импульс, созданный функцией PtAppCreatePulse()

msg указатель на сообщение импульса, созданное функцией. Это конец импульса на стороне отправителя, и мы должны будем отослать его этому процессу, как это описано ниже.

Эта функция возвращает указатель на идентификатор сообщения импульса, который понадобится нам позже.

          1. Пересылка сообщения импульса испускателю импульсов

Метод, который Вы используете для отсылки сообщения импульса, зависит от процесса, который будет испускать импульсы:

  • Для менеджеров ресурсов:

ionotify(fd, _NOTIFY_ACTION_ARM, _NOTIFY_COND_INPUT, &pulsemsg);

  • Для любого другого типа процесса:

/*Создание своего собственного формата сообщения: */

msg.pulsemsg=pulsemsg;

MsgSendv(channel_id, &msg, msg_parts, &rmsg, rmsg_parts);

          1. Регистрация обработчика ввода

Регистрация обработчика ввода для импульса похожа на регистрацию обработчика ввода для сообщения; см. раздел "Добавление обработчика ввода" выше в этой главе. Передайте идентификатор импульса, возвращённый функцией PtAppCreatePulse(), как параметр pid в функции ptAppAddInput().

Аргумент rcvid для обработчика ввода не будет иметь обязательно то же значение, что и идентификатор импульса: он сопоставляет идентификатор импульса в битах, определённых в _NOTIFY_DATA_MASK (см. описание ionotify() в "Справочнике библиотечных функций QNX 6"), но остальные биты берутся из полученного импульса QNX.

Соседние файлы в папке Литература_1