-
В MSDN есть такой список вариантов взаимодействия между приложениями (процессами):
The following IPC mechanisms are supported by Windows:
Clipboard COM Data Copy DDE File Mapping Mailslots Pipes RPC Windows Sockets
Кто может навскидку сказать что лучше выбрать с точки зрения скорости обмена данными с учетом того, что приложения могут взаимодействовать как в рамках одной машины так и на разных машинах (но в одной локальной сети).
-
> что приложения могут взаимодействовать как в рамках одной > машины так и на разных машинах (но в одной локальной сети) > .
> Windows Sockets
-
> > Windows Sockets
А трубы? Они вроде тоже могут по сети работать. Или они медленней получатся?
-
В рамках локалки - сокеты, пайпы поверх них сидят, т.е. лишний траффик (если уж так сильно оптимизировать надо) + некоторые заморочки с безопасностью могут вылезти.
-
Rouse_, здраствуйте. Скачал ваш пример FWIOCompletionPipes. Там пример с передачей чисел. Че-то туплю и не могу сделать передачу текста(String, PChar и т.д.). Не подскажете, как это можно сделать? Спасибо.
-
String, PChar и т.д. это указатели на данные. Стало быть, передавай их не их самих, а непосредственно то, на что они указывают.
-
> Кто может навскидку сказать что лучше выбрать с точки зрения > скорости обмена данными с учетом того, что приложения могут > взаимодействовать как в рамках одной машины
пайпы значительно быстрее
> так и на разных машинах
сокеты быстрее
-
> String, PChar и т.д. это указатели на данные. > Стало быть, передавай их не их самих, а непосредственно > то, на что они указывают.
Блин. Чего-то не получается у меня. Получаю EAccessViolation.
-
Не показывай код, дождись когда подтянутся телепаты.
-
Клиент: procedure TForm1.Button1Click(Sender: TObject);
var
InString, OutString: String;
PipeClient: TFWPipeClient;
InStream, OutStream: TMemoryStream;
begin
InString := Edit1.Text;
try
PipeClient := TFWPipeClient.Create('.', 'FWIOCompletionPipeServer');
try
PipeClient.Active := True;
InStream := TMemoryStream.Create;
try
OutStream := TMemoryStream.Create;
try
InStream.Clear;
InStream.WriteBuffer(Pointer(InString)^, Length(InString));
PipeClient.SendData(InStream, OutStream);
finally
OutStream.Free;
end;
finally
InStream.Free;
end;
finally
PipeClient.Free;
end;
except
on E:Exception do
Memo1.Lines.Add(E.Classname + ': ' + E.Message);
end;
end; Сервер: procedure TSimpleObject.Read(Sender: TObject; PipeInstance: PFWPipeData);
var
InString: String;
begin
Move(PipeInstance^.ReadBuff[0], InString, PipeInstance^.ReadBuffSize);
Form1.Memo1.Lines.Add('Str = ' + InString);
end;
-
Навскидку SetLength(InString,PipeInstance^.ReadBuffSize);
Move(PipeInstance^.ReadBuff[0], InString[1], PipeInstance^.ReadBuffSize);
-
1. PipeClient.SendData - проверь, по памяти не помню, правит ли он позицию перед отправкой. Если нет, то выставляй ее в ноль перед вызовом 2. Move(PipeInstance^.ReadBuff[0], InString, PipeInstance^.ReadBuffSize); Для начала желательно передавать размер строки и потом е саму, в противном случае поимееш проблем на склейке пакетов, ну есессно размер принимаещего буфера у тебя не выставлен, как и сказал Германн. 3. тоже проверь, если принимающий буфер не требуется то и создавать OutStream не нужно
ЗЫ: щас просто без кода сижу, поэтому по памяти все говорю...
-
Теперь AV нету, но принимает стоку коряво.
Отправляю: "Edit1", получаю: "Edu". Отп.: "kak dela?", пол.: "kak dipe\"
-
procedure TFWPipeClient.SendData(InStream, OutStream: TStream);
var
lpBytesRead: DWORD;
begin
InStream.Position := 0;
InStream.ReadBuffer(FBuff[0], InStream.Size);
Win32Check(TransactNamedPipe(FPipe, @FBuff[0], InStream.Size,
@FBuff[0], MAXWORD, lpBytesRead, nil));
OutStream.Size := 0;
OutStream.WriteBuffer(FBuff[0], lpBytesRead);
OutStream.Position := 0;
end;
-
Скорее всего тут проблема: InStream.WriteBuffer(Pointer(InString)^, Length(InString)); строки юникодные?
-
> Скорее всего тут проблема: > InStream.WriteBuffer(Pointer(InString)^, Length(InString)); > > строки юникодные?
InString := Edit1.Text; Вроде нет
-
> Вроде нет
Ну мы ж не бабки-гадалки, сделай все свои строки в виде AnsiString и проверь...
-
Добавил инфо: procedure TSimpleObject.Read(Sender: TObject; PipeInstance: PFWPipeData);
var
InString: String;
begin
WriteToFile('server.log', 'Length = ' + IntToStr(PipeInstance^.ReadBuffSize));
SetLength(InString, PipeInstance^.ReadBuffSize);
Move(PipeInstance^.ReadBuff[0], InString[1], PipeInstance^.ReadBuffSize);
WriteToFile('server.log', 'Str = ' + InString);
end;
При получении "Edit1" в файле имеется: Length = 5 Str = Ed???
-
После изменения String на AnsiString получаю:
Length = 5 Str = ?????
-
> krupt © (12.12.12 23:49) [18] > > После изменения String на AnsiString получаю:
В клиенте тоже такую замену сделал?
|