Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.27;
Скачать: CL | DM;

Вниз

Named Pipes   Найти похожие ветки 

 
Nostradamus   (2006-05-06 03:35) [0]

Помогите, пожалуйста, разобраться с Named pipes.

Создаю pipe на сервере:

hPipe := CreateNamedPipe(pipeName, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE OR PIPE_NOWAIT, 1, 0, 0, 0, nil);


Открываю pipe на клиенте:
fPipeHandle := CreateFile(PCHAR(fPipeName), GENERIC_READ OR GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);

Шлю команды на сервер:

var
S : String;

WriteFile(fPipeHandle, PChar(S)^,  Length(S), bytesWrite, nil);


Всё ок...

На клиенте жду от сервера ответа:


const
 BytesToRead = 1024;
var
bytesRead : Cardinal;
Buffer: array [0..BytesToRead] of Char;

ReadFile(fPipeHandle, Buffer, BytesToRead, bytesRead, nil);


НО если сервер ничего не отвечает клиенту то клиент виснет :( т.к. ReadFile не возвращает управление проге.

Как этого избежать?

TThread что характерно, тоже не помог.


 
Slym ©   (2006-05-06 04:34) [1]

1. ReadFile(fPipeHandle, Buffer, BytesToRead, bytesRead, nil); не передавай nil
2. PeekNamedPipe


 
Nostradamus   (2006-05-06 05:58) [2]


> 1. ReadFile(fPipeHandle, Buffer, BytesToRead, bytesRead,
>  nil); не передавай nil


Я с overlapped пробовал - тоже, что-то не сложилось, не подскажешь конкретнее?

Я делал так:
На сервере:

hPipe := CreateNamedPipe(pipeName, PIPE_ACCESS_DUPLEX OR FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE OR PIPE_NOWAIT, 1, 0, 0, 0, nil);


На клиенте:

hEvent := CreateEventW(nil, True, False, nil);
FillChar(Overlap, SizeOf(OVERLAPPED), 0);
Overlap.hEvent := hEvent;
ReadFile(fPipeHandle, Buffer, BytesToRead, bytesRead, @Overlap);



> 2. PeekNamedPipe


Не виснет, но и в буфере почему-то ничего нет даже когда сервер таки отсылает ответ :(


FillChar(Buffer, SizeOf(Buffer), 0);
PeekNamedPipe(fPipeHandle, @Buffer, BytesToRead, @BytesRead, @BytesAvail,  @BytesRem);


У меня такое чувство, что я что-то не правильно передаю, но что - не пойму.


 
Slym ©   (2006-05-06 06:09) [3]

Nostradamus   (06.05.06 5:58) [2]
что я что-то не правильно передаю

Кстати код передачи покажи


 
Slym ©   (2006-05-06 06:10) [4]

WriteFile(fPipeHandle, PChar(S)^,  Length(S), bytesWrite, nil);
^ -это зачем?


 
Сергей М. ©   (2006-05-06 08:09) [5]


> Nostradamus   (06.05.06 03:35)


А где ConnectNamedPipe() ?


 
Nostradamus   (2006-05-06 14:32) [6]

>Кстати код передачи покажи

Я имел ввиду, что какие-то параметры в функции не правильно передаю, а данные именно так и передаются:

WriteFile(fPipeHandle, S,  Length(S), bytesWrite, nil);

>^ -это зачем?

Это я прогнал :), но если это убрать, то всё равно ничего не меняется

>А где ConnectNamedPipe() ?

hPipe := CreateNamedPipe(pipeName, PIPE_ACCESS_DUPLEX OR FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE OR PIPE_NOWAIT, 1, 0, 0, 0, nil);
if hPipe <> INVALID_HANDLE_VALUE then
ConnectNamedPipe(hPipe, nil)


 
Сергей М. ©   (2006-05-06 15:55) [7]

А где анализ результата вызова ConnectNamedPipe ?


 
Сергей М. ©   (2006-05-06 15:57) [8]

А где анализ результата вызова ConnectNamedPipe ?

И почему экз-р пайпа явно создается тобой для работы в OVERLAPPED-режиме, но при этом OVERLAPPED-структура нигде не используется - ни в ConnectNamedPipe, ни в  ReadFile, ни в WriteFile ?


 
Nostradamus   (2006-05-06 16:37) [9]


> А где анализ результата вызова ConnectNamedPipe ?
>
> И почему экз-р пайпа явно создается тобой для работы в OVERLAPPED-
> режиме, но при этом OVERLAPPED-структура нигде не используется
> - ни в ConnectNamedPipe, ни в  ReadFile, ни в WriteFile
> ?
>


Учёл Ваши замечания:

Сервер:

var
 hEvent: THANDLE;
 OverLap: OVERLAPPED;

hPipe := CreateNamedPipe(pipeName, PIPE_ACCESS_DUPLEX OR FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE, 1, 0, 0, 0, nil);
if hPipe = Invalid_Handle_Value then
 MessageBox(Handle, "Unable to create a named pipe", "Error", MB_OK)
else begin
 hEvent := CreateEventW(nil, True, False, nil);
 FillChar(Overlap, SizeOf(OVERLAPPED), 0);
 Overlap.hEvent := hEvent;

 if not ConnectNamedPipe(hPipe, @Overlap) then
  MessageBox(Handle, PCHAR(SysErrorMessage(GetLastError)), "Error", MB_OK);
end;


Клиент:

const
 BytesToRead = 1024;
var
 hEvent: THANDLE;
 OverLap: OVERLAPPED;
 bytesRead : Cardinal;
 Buffer: array [0..BytesToRead] of Char;
begin
hEvent := CreateEventW(nil, True, False, nil);
FillChar(Overlap, SizeOf(OVERLAPPED), 0);
Overlap.hEvent := hEvent;

if ReadFile(fPipeHandle, Buffer, BytesToRead, bytesRead, @Overlap) then
 SetString(Reply, Buffer, BytesRead);


Если сервер ничего не отвечает, то ReadFile не возвращает управление, не смотря на OVERLAPPED-режим  :(


 
Сергей М. ©   (2006-05-06 16:45) [10]


> Если сервер ничего не отвечает, то ReadFile не возвращает
> управление, не смотря на OVERLAPPED-режим


.. и это совершенно нормальное явление для OVERLAPPED-режима.

Справку читал ?


 
Nostradamus   (2006-05-06 17:07) [11]

Справку читал долго и нудно.
Я пробовали и с OVERLAPPED и без и с PIPE_NOWAIT всё равно не могу добиться нужного результата.

Очевидно с ReadFile так и не получится, но почему
PeekNamedPipe(fPipeHandle, @Buffer, BytesToRead, @BytesRead, @BytesAvail,  @BytesRem);

в буфер ничего не попадает?


 
Eraser ©   (2006-05-06 18:45) [12]


> Nostradamus   (06.05.06 17:07) [11]

а задача какая, потому что я не очень понял нужен синхронный или асинхронный режим? От этого многое зависит.
+ см. http://www.delphimaster.ru/articles/named_pipes/index.html


 
Nostradamus   (2006-05-06 19:24) [13]


> а задача какая, потому что я не очень понял нужен синхронный
> или асинхронный режим? От этого многое зависит.


Мне всё равно, точне нужен скорее синхронный режим.

Проблема в том, что программа не отвечает пока сервер не пошлёт ответ.
Нужно чтобы не смотря на то, что сервер ничего не послал работал UI.


> + см. http://www.delphimaster.ru/articles/named_pipes/index.
> html


Смотрел уже, но разобраться как решить мою проблему так и не удалось :(


 
Eraser ©   (2006-05-06 19:29) [14]


> Nostradamus   (06.05.06 19:24) [13]

дык в том примере так и сделано...


 
Eraser ©   (2006-05-06 19:31) [15]

суть в том, что надо отделить мух от котлет и выполнять отсылку данных в одном потоке, работу с консольным в водом в другом, а главный поток вообще оставить в покое для GUI.



Страницы: 1 вся ветка

Текущий архив: 2006.08.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.032 c
2-1154630337
Exit
2006-08-03 22:38
2006.08.27
Whois


3-1150457691
avsam
2006-06-16 15:34
2006.08.27
ODAC: Exec PL/SQL


1-1152251750
just
2006-07-07 09:55
2006.08.27
Delphi пропускает строки кода при компиляции


4-1146727029
Klopan
2006-05-04 11:17
2006.08.27
Службы


2-1154918244
kobik.
2006-08-07 06:37
2006.08.27
Stream - пустой / не пустой