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

Вниз

Про pipe ы.   Найти похожие ветки 

 
h8394E   (2006-04-05 04:14) [0]

Вот, в статье на вашем сайте, по адрессу http://www.delphimaster.ru/articles/named_pipes/index.html приведён и код, и исходники. Одна проблема... Я в Windows API не очень смыслю, но как я понял, там же именно на них окна и создавались. А я в своём приложении формы делаю... Помогите пожалуйста, переведите те исходники для сервера и клиента... У сервера мне только чнение pipe"ы надо, а клиент запускается-то на несколько милисекунд.


 
balepa ©   (2006-04-05 06:38) [1]

Там же блин коментариев в каждой строчке по 2 (по 3 по 4 и т.д.) + книжек много разных есть + интернет.
А в WinApi надо смыслить начинать. И встречный вопрос что понимать под -
"Помогите пожалуйста, переведите те исходники для сервера и клиента" тебе че на китайский перевести ?


 
Сергей М. ©   (2006-04-05 08:33) [2]


> там же именно на них окна и создавались


Окна не имеют никакого отношения к пайпам.


 
balepa ©   (2006-04-05 09:11) [3]


> Сергей М. ©   (05.04.06 08:33) [2]

Автор наверное имел ввиду на WinApi, хотя я в статье этого не увидел (мож пплохо смотрел)


 
Fay ©   (2006-04-05 10:34) [4]

Полный текст примера сервера и клиента, использующих именованный канал для коммуникации можно найти в приложении к статье.


 
Игорь Шевченко ©   (2006-04-05 11:08) [5]

Формы делать - тоже хорошее занятие


 
h8394E   (2006-04-06 03:24) [6]

Так, вот, кое-как разобрался, написал так:

unit MainUnit;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Memo1: TMemo;
   Memo2: TMemo;
   Button1: TButton;
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

type TEnterPipe = packed record
 Name:string;
 IP:string;
 bEvent:byte;
end;

type
 TNamedPipeThread = class(TThread)
 private
 EPdata:TEnterPipe;
 Terminated: boolean;
 protected
   procedure Execute; override;
 public
   procedure ShowData;
   procedure AddToLog(s:string);
   procedure TurnOff;
   constructor Create(CreateSuspended: Boolean); reintroduce; overload;
 end;

var
 Form1: TForm1;
 TrPipe:  TNamedPipeThread;

implementation

{$R *.dfm}

{ TNamedPipeThread }

procedure TNamedPipeThread.AddToLog(s:string);
begin
form1.Memo1.Lines.Add(s);
end;

constructor TNamedPipeThread.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
if not CreateSuspended then Execute;
end;

procedure TNamedPipeThread.Execute;
const
 MAX_PIPE_INSTANCES = 10;
 OUT_BUF_SIZE = SizeOf(EPdata);
 MAX_READ = SizeOf(EPdata);
 TIME_OUT = 100;
var
 hPipe: THandle;
 bytesRead: DWORD;
begin
terminated:=false;
 try
  hPipe := CreateNamedPipe("\\.\PIPE\TMApipe",
     PIPE_ACCESS_INBOUND,
     PIPE_WAIT or
     PIPE_READMODE_MESSAGE or
     PIPE_TYPE_MESSAGE,
     MAX_PIPE_INSTANCES,
     OUT_BUF_SIZE,
     OUT_BUF_SIZE,
     TIME_OUT,
     nil);
   if hPipe = INVALID_HANDLE_VALUE then
   begin
     AddToLog("Error - CreateNamedPipe");
     Exit;
   end;
   while true do //Даже если безконечный цыкл убрать, то
   begin
     try
       ConnectNamedPipe(hPipe, nil); //вот здесь виснит
       if ReadFile(hPipe, EPdata, MAX_READ, bytesRead, nil) then
       begin
         ShowData;
       end;
     finally
       DisconnectNamedPipe(hPipe);
     end;
    end;
 finally
 end;
end;

procedure TNamedPipeThread.ShowData;
begin
form1.Memo2.Lines.Add("New user: "+EPData.Name);
case epdata.bEvent of
1: form1.Memo2.Lines.Add("Have registrated.");
2: form1.Memo2.Lines.Add("Have entered.");
3: form1.Memo2.Lines.Add("Trying to registrate.");
end;
form1.Memo2.Lines.Add("His IP is: "+EPData.IP);
end;

procedure TNamedPipeThread.TurnOff;
begin
Terminated:=true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
TrPipe:=TNamedPipeThread.Create(false);
end;

end.


Так вот, почему-то программа виснит. А после пторого подключения клиета сервер ошибку выдаёт, и перестаёт работать.
Вопрос: правилен и код?


 
Сергей М. ©   (2006-04-06 08:31) [7]


> ConnectNamedPipe(hPipe, nil); //вот здесь виснит


Все правильно - вызов-то блокирующий ..
Так и будет висеть, пока очередь клиентских запросов на подключение пуста.
Как только будет обнаружен очередной запрос, ф-ция акцептирует его и тут же вернет управление.


> после пторого подключения клиета


Какого "второго" ? Первое еще не произошло, сам же говоришь - "сервер виснит" ..

А где, кстати, код клиента ? Приводи уж и его тоже до кучи ...


> сервер ошибку выдаёт


Какую конкретно ?

p.s.
Обращение к визуальным VCL-контролам в дополнительном потоке процесса VCL-приложения не допустимо.


 
Сергей М. ©   (2006-04-06 10:04) [8]

Еще одна реализации NP-транспорта в Делфи-компонентах + демо-проект:

http://ourworld.compuserve.com/homepages/mikes/NPipes02.zip


 
h8394E   (2006-04-07 01:04) [9]

Сергей М, Вот клиент(точнее процедура только отправки в pipe)
procedure SendToServer(Data: TEnterPipe);
const
 MAX_WRITE = SizeOf(Data);
var
 hPipe: THandle;
 bytesWritten: DWORD;
 LastError: DWORD;
begin
 hPipe := CreateFile("\\.\PIPE\TMApipe",
   GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
 if hPipe = INVALID_HANDLE_VALUE then
 begin
 form1.Memo1.Lines.Add("No pipe found");
 Exit;
 end;
WriteFile(hPipe, Data, MAX_WRITE, bytesWritten, nil)
end;


> Все правильно - вызов-то блокирующий ..

А как его асинхронным сделать (я так понимаю ты это имел ввидую Если нет, то как сделать не блокирующим)?
> Какого "второго" ? Первое еще не произошло, сам же говоришь
> - "сервер виснит" ..

Ну, так я сервак запускаю - он повешен. Запускаю процедуру, что выше первый раз - ничего. А при втором даёт ошибку "Проект Server.exe вызвал исключение языка EAccessViolation по адресу..." И так далее...
Ошибка из-за
> Обращение к визуальным VCL-контролам в дополнительном потоке
> процесса VCL-приложения не допустимо.

А как мне тогда пришедшие данные показать?

> Еще одна реализации NP-транспорта

Там чё-то для Delphi 2 в Win95. В нём асинхронное соединение вообще сделать нельзя, насколько я знаю.


 
Сергей М. ©   (2006-04-07 08:53) [10]


> Вот клиент


В целом - ничего криминального ..


> Запускаю процедуру, что выше первый раз - ничего


Почему не анализируешь результата вызова WriteFile() ?
Почему hPipe не закрываешь после завершения обмена с сервером ?


> Проект Server.exe вызвал исключение языка EAccessViolation
> по адресу...


Собери проект сервера с опциями отладки. Запусти под отладчиком.
Сразу же в меню Search -> Find Error .. введи этот самый адрес - отладчик с достаточной долей вероятности покажет тебе строчку в исх.тексте серверного приложения, которая вызвала исключение.

И вообще - отладчик на то и дан, чтобы пользоваться им для поиска ошибок и отладки.


> как его асинхронным сделать


см. в справке все касающееся overlapped-режима для ф-ций, работающих с пайпами.


> как мне тогда пришедшие данные показать?


см. метод TThread.Synchronize()


> Там чё-то для Delphi 2 в Win95


Тот код достаточно легко адаптируется к D7.
У тебя WinXP указан, так что тебя ограничения пайпов для Win95 тебя не касаются. Да и не будет пайп-сервер работать под Win9x вообще.


> В нём асинхронное соединение вообще сделать нельзя


Там как раз синхронный транспорт использован.


 
h8394E   (2006-04-08 16:33) [11]


> см. метод TThread.Synchronize()

Странно, но даже так при вызове процедуры, где form1.memo1.lines.add(EPData.name); - выходит ошибка. Делал так:

TMyThread.Synchronize(ShowData);
...
TMyThread. ShowData;
begin
form1.memo1.lines.add(EPData.name);
end;


 
Eraser ©   (2006-04-08 18:50) [12]


> h8394E   (08.04.06 16:33) [11]

TMyThread.Synchronize(ShowData);

всё таки, прежде чем писать многопоточные приложения, неплохо бы книжку почитать по программированию какую-нибудь :)



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

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

Наверх




Память: 0.51 MB
Время: 0.05 c
8-1132228825
CondAL
2005-11-17 15:00
2006.04.23
проиграть события в midi файлах


15-1143679029
grisme
2006-03-30 04:37
2006.04.23
Еще один подозрительный 2й интегралл


1-1142768719
Jean Claude
2006-03-19 14:45
2006.04.23
Сборка линкером от M$


2-1144653457
shapm
2006-04-10 11:17
2006.04.23
Как обратиться к элементам массива записей без использования имен


2-1144441233
Gamer
2006-04-08 00:20
2006.04.23
Проблема с нетипизированным файлом