Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
56
Добавлен:
02.04.2015
Размер:
9 Мб
Скачать
☆

Импульсы Photon'а

[Прим. пер. Импульсы Photon'а – это отнюдь не импульсы QNX 6, а прокси QNX 4. Именно этот механизм.]

В дополнении к синхронному обмену сообщений, Photon поддерживает импульсы. Процесс, желающий уведомить другой процесс, но не желающий при этом ожидать ответа, может использовать импульсы Photon'а. Например, сервер может использовать импульс, чтобы общаться с клиентом в ситуации, когда отсылка сообщения может оставить их обоих SEND-блокированными (и поэтому попавшими в тупик). Импульс Photon'а определяется по его отрицательному идентификатору процесса, который может быть использован в качестве аргумента pid функции PtAppAddInput(). Этот идентификатор процесса является локальным для Вашего приложения. Если Вы хотите, чтобы другой процесс прислал Вам импульс, Вы должны "взвести" импульс, используя функцию PtPulseArm(). Это создаёт объект типа PtPulseMsg_t, который может быть послан другому процессу в сообщении. Другой процесс затем будет способен посылать импульсы, вызывая функцию MsgDeliverEvent().

 В OC QNX версии 6 тип PtPulseMsg_t является структурой sigevent. Биты в msg.sigev_value.sival_int, которые соответствуют _NOTIFY_COND_MASK, сброшены, но могут быть установлены приложением, отсылающим импульс. Более подробно см. в описании функции ionotify() "Справочника библиотечных функций QNX 6".

PtPulseArm() (описанная в "Справочнике библиотечных функций Photon'а ") просто берёт структуру sigevent. Функции PtPulseArmFd() и PtPulseArmPid() существуют для совместимости с более ранними версиями OC QNX и Photon microGUI.

Давайте посмотрим код, который Вам надо написать, чтобы поддерживать импульс в:

  • Приложении Photon'а, которое получает импульсы

  • Приложении Photon'а, которое выпускает импульсы

Приложение Photon'а, получающее импульсы

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

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

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

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

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

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

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

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

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

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

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

pid_t PtAppCreatePulse(PtAppContext_t app, int priority);

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

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

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

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

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