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

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

Вот в качестве примера ответная реакция, которая извлекает строку из текстового виджета, отсылает её другому процессу, и отображает ответ в том же текстовом виджете:

/* Ответная реакция, отсылающая сообщение другому процессу */

/* Стандартные хеадеры */

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <sys/neutrino.h> /* Требуется для MsgSend() */

/* Инструментальные хеадеры */

#include <Ph.h>

#include <Pt.h>

#include <Ap.h>

/* Локальные хеадеры */

#include "globals.h"

#include "abimport.h"

#include "proto.h"

extern int coid;

int send_msg_to_b( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo ) {

char *a_message;

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

widget = widget, apinfo = apinfo, cbinfo = cbinfo;

/* Получает строку из текстового виджета */

PtGetResource (ABW_msg_text, Pt_ARG_TEXT_STRING, 0, 0);

/* Отсылает строку другому процессу */

a_message = (char *)args[0].value;

if ( MsgSend (coid, a_message, msg_size, rcv_msg, msg_size) == -1) {

perror ("Отсылка не удалась ");

PtExit (-1);

}

/* Помните, что UI (пользовательский интерфейс) "висит",

пока другой процесс не ответит! */

/* Отображение ответа в том же текстовом виджете */

PtSetResource (ABW_msg_text, Pt_ARG_TEXT_STRING, rcv_msg, 0);

return( Pt_CONTINUE );

}

Для получения подробной информации см. "Руководство по системной архитектуре QNX 6".

    1. Приём qnx-сообщений

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

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

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

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

Вы можете зарегистрировать неопределённый обработчик ввода, определив в качестве rcvid нулевое значение. Такой обработчик вызывается, когда приложение получает:

  • любое не-Photon'овское сообщение, которое не имеет обработчика ввода, конкретно связанного с rcvid клиента.

  • пользовательский импульс (т.е. импульс с неотрицательным кодом).

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