Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
76
Добавлен:
02.04.2015
Размер:
8.79 Mб
Скачать
          1. Функции name_attach и PtAppAddInput()

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

  • Клиент, подключающийся к связи, не является приложением Photon'а.

  • Клиент, подключающийся к связи, принадлежит другой сессии Photon'а.

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

PtAppAddInput() и name_attach() обе пытаются создать канал с установками _NTO_CHF_COID_DISCONNECT и _NTO_CHF_DISCONNECT (см. "Справочник библиотечных функций QNX 6"). Если Ваше приложение вызывает обе функции, Вам надо позволить Photon'у использовать тот же канал, что и использует функция name_attach(), вызвав прежде всего функцию PhChannelAtach() таким образом:

PhChannelAtach(chid, -1, NULL);

перед вызовами функций name_attach() или PhAppAddInput(). Если Вы хотите создать отдельный канал для Photon'а, нет разницы, создаёте ли Вы его и передаёте его функции PhChannelAtach() до или после вызова name_attach(). Но имейте в виду, что поскольку определённые механизмы библиотеки Photon'а предполагают, что канал Photon'а имеет два установленных флага DISCONNECT, они могут неправильно работать, если это не так. Одним из таких механизмов является определение нарушенной связи (см. функции PtConnectionClientSetError() и PtConnectionServerSetError()) и всё, что зависит от этого механизма.

          1. Удаление обработчика ввода

Чтобы удалить обработчик ввода:

  • Получите от него код возврата Pt_END

или

  • Вызовите функцию PtAppRemoveInput(), передав её в качестве аргумента идентификатор, возвращённый функцией PtAppAddInput().

          1. Размер буфера сообщений

Как описано выше, аргументы Вашей функции ввода включают:

msg Указатель на буфер событий, использованный для получения сообщений.

msglen Размер буфера.

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

  • Перечитать сообщение целиком, вызвав функцию MsgReadv()

или

  • Скопировать часть, которую Вы уже получили, в новый буфер. Получить остаток сообщения, вызвав MsgReadv(). Добавить остаток сообщения к первой части.

Альтернативным способом является установка размера буфера событий таким, чтобы он мог вместить самое большое сообщение, которое получит Ваше приложение (если Вы это знаете). Это может быть выполнено функцией PtResizeEventMsg(). Обычно Вы должны выполнить этот вызов до того, как предполагаете получить какие-либо сообщения.

 Функция PtResizeEventMsg() не уменьшит буфер сообщений меньше определённого минимального размера. Это потому, что библиотека виджета хочет продолжить функционировать.

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