Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.044 c
15-1154427261
lurce
2006-08-01 14:14
2006.08.27
Советский Энциклопедический Словарь в эл. виде


9-1133327946
Da Stranger
2005-11-30 08:19
2006.08.27
Про стрельбу


4-1146820955
Dimich1978
2006-05-05 13:22
2006.08.27
получить handle окна по неполному имени


15-1154381487
Yura32
2006-08-01 01:31
2006.08.27
SQL script


2-1155087755
vladimirg88
2006-08-09 05:42
2006.08.27
Форма





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский