Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform
Шрифт:
Ядро резервирует отрицательные значения параметра code, оставляя 127 значений для программистов — для использования по своему усмотрению.
Элемент value в действительности является элементом типа
Поэтому (в развитие примера с сервером, представленного выше) вы часто будете видеть программу, подобную
В этой программе предполагается, конечно, что вы описали структуру msg так, чтобы она содержала элемент «
Функции MsgReceive и MsgReceivev могут принимать либо стандартное сообщение, либо импульс. Однако, возможны ситуации, когда вы пожелаете принимать только импульсы. Лучшим примером этого является ситуация с сервером, когда вы приняли запрос от клиента на выполнение чего-нибудь, но не можете выполнить этот запрос сразу (возможно, из-за длительной операции, связанной с аппаратными средствами). В таких случаях следует, как правило, настроить аппаратные средства (или таймер, или что-нибудь еще) на передачу вам импульса всякий раз, когда происходит некое значительное событие.
Если вы напишете ваш сервер по стандартной схеме «ждать сообщения
В таком случае вам потребуется обеспечить возможность «выборочного» приема только импульсов. Тут-то и становится актуальной функция MsgReceivePulse:
Видно, что ее параметры те же, что и у функции MsgReceive — идентификатор канала, буфер (и его размер), и параметр info — мы обсуждали его в параграфе «Кто послал сообщение?» Заметьте, что параметр info не применяется в импульсах. Вы можете спросить, почему он представлен в списке параметров. Ответ незамысловат: так было проще сделать. Просто передайте NULL!
Функция MgsReceivePulse способна принимать только импульсы. Так, если бы у вас был канал с множеством потоков, блокированных на нем с помощью функции MsgReceivePulse (и ни одного потока, блокированного на нем с помощью функции MsgReceive), и некий клиент попытался бы отправить вашему серверу сообщение, то этот клиент остался бы заблокированным по передаче (Send-blocked) до тех пор, пока какой-либо поток сервера не вызовет MsgReceive. Тем временем функция MsgReceivePulse будет спокойно принимать импульсы.
Единственное, что можно гарантировать при совместном применении функций MsgReceivePulse и MsgReceive, — что функция MsgReceivePulse обеспечит прием исключительно импульсов. Функция MsgReceive сможет принимать как импульсы, так и обычные сообщения! Это происходит потому, что применение функции MsgReceivePulse зарезервировано специально для случаев, где нужно исключить получение сервером обычных сообщений.
Это немного вводит в замешательство. Так как функция MsgReceive может принимать и обычные сообщения, и импульсы, а функция MsgReceivePulse может принимать только импульсы, то как быть с сервером, в котором применяются обе функции? Общий ответ такой. У вас есть пул потоков, выполняющих MsgReceive. Этот пул потоков (один или более потоков — это зависит от числа клиентов, которое вы хотели бы обслуживать одновременно) отвечает за обработку запросов от клиентов.