Содержание материала

 
==========СЕРВЕРНАЯ ЧАСТЬ==========
 
3.Использование потоков (TThread):
Как такового события записи в канал нет, поэтому придётся запускать цикл чтения. Как известно, циклы подвешивают программы (а точнее зацикливают). Application.ProcessMessages при работе с функцией ReadFile не поможет, так как ReadFile будет выполнятся до тех пор, пока кто-то что-то не запишет. Поэтому надо использовать потоки (TThread). Хочу заметить, что обращение к визуальным компонентам (формам, кнопкам, лэйблам и так далее) из дополнительных потоков невозможно. Для того, чтобы полученные данные не остались в дополнительном потоке, надо его синхронизироватьс главным. Для этого есть функция TThread.Synchronize(method: TtreadMethod); Параметром этой функции надо передовать Какой-нибудь метод(нами созданный) дополнительного потока, где есть обращение к визуальным компонентам.
А теперь напишем код нашего потока:
 

Code:

type

TPipeThread = class(TThread)

private

PipeData:TPipeData; //Вот он – наша приёмная переменная, а точнее буфер.

Protected

   procedure Execute; override; //Здесь мы будем создавать канал и читать данные из него

public

   procedure ShowData; //Здесь будем передовать данные форме

   constructor Create(CreateSuspended: Boolean); reintroduce; overload; //Создание потока

end;

 
4. Работа сименными каналами:
Здесь мы рассмотрим нашу процедуру TpipeThread.Execute; но сначала рассмотрим «настройку» наших каналов. Функция CreateNamedPipe доступна только серверу. Ей должны быть переданы следующие параметры:
1. lpName имя нашего канала, а точнее его директория. Если сервер будет расположен на той-же машине, что и клиент, то первый параметр должен быть такой: '\\.\PIPE\ИмяКанала', где имя канала ваше название, только латинскими буквами
2. dwOpenMode работа канала может быть:
PIPE_ACCESS_INBOUND сервер может только читать канал
PIPE_ACCESS_OTTBOUND сервет может только записывать
PIPE_ACCESS_DUPLEX сервер может и писать и читать
3. dwPipeMode режим канала здесь говорится о синхронности\асинхронности канала, и о том, каким методом будетпроизводится обмен данных в канале. Значения:
PIPE_WAIT - синхронный канал
PIPE_NOWAIT асинхронный канал
PIPE_READMODE_BYTE метод чтения - байты
PIPE_READMODE_MESSAGE метод чтения пакеты
PIPE_TYPE_BYTE тип канала - байты
PIPE_TYPE_MESSAGE - тип канала пакеты.
В dwPipeMode надо передавать три параметра, например, в нашем примере: PIPE_WAIT or PIPE_READMODE_MESSAGE or PIPE_TYPE_MESSAGE. А теперь, давайте вспомним наш тип TpipeData он у нас packed, то есть пакет. Поэтому наш канал работает с пакетами.
4. hMaxInstances максимальное число одновременных подключений любое ваше число, однако можно указать PIPE_UNLIMITED_INSTANCES для безконечного числа клиентов.
5. nOutBufferSize разбер буфера чтения. Можно найти так SizeOf(TpipeData) Это как раз тип нашего буфера.
6. nInBufferSize размер буфера записи. Обычно такой же как и буфер чтения.
7. nDefaultTimeOut максимальное время чтения (в милисекундах)
8. lpSecurityArtributes просто пишем nil.
Также нам понядобятся фцнкции ConnectNamedPipe, ReadFile и DisconnectNamedPipe, но их параметры мы рассмотрим в процессе написания кода. И так, а теперь наша процедура:
 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить