Конференция "WinAPI" » Выбор способа межпроцессного взаимодействия [D7, WinXP]
 
  • vlk32 (13.11.12 19:08) [0]
    В MSDN есть такой список вариантов взаимодействия между приложениями (процессами):

    The following IPC mechanisms are supported by Windows:

       Clipboard
       COM
       Data Copy
       DDE
       File Mapping
       Mailslots
       Pipes
       RPC
       Windows Sockets

    Кто может навскидку сказать что лучше выбрать с точки зрения скорости обмена данными с учетом того, что приложения могут взаимодействовать как в рамках одной машины так и на разных машинах (но в одной локальной сети).
  • brother © (13.11.12 19:21) [1]
    > что приложения могут взаимодействовать как в рамках одной
    > машины так и на разных машинах (но в одной локальной сети)
    > .


    > Windows Sockets
  • vlk32 (13.11.12 19:25) [2]

    > > Windows Sockets


    А трубы? Они вроде тоже могут по сети работать. Или они медленней получатся?
  • Rouse_ © (13.11.12 20:35) [3]
    В рамках локалки - сокеты, пайпы поверх них сидят, т.е. лишний траффик (если уж так сильно оптимизировать надо) + некоторые заморочки с безопасностью могут вылезти.
  • krupt © (08.12.12 00:51) [4]
    Rouse_, здраствуйте. Скачал ваш пример FWIOCompletionPipes. Там пример с передачей чисел. Че-то туплю и не могу сделать передачу текста(String, PChar и т.д.). Не подскажете, как это можно сделать? Спасибо.
  • Rouse_ © (08.12.12 01:01) [5]
    String, PChar и т.д. это указатели на данные.
    Стало быть, передавай их не их самих, а непосредственно то, на что они указывают.
  • DVM © (08.12.12 01:15) [6]

    > Кто может навскидку сказать что лучше выбрать с точки зрения
    > скорости обмена данными с учетом того, что приложения могут
    > взаимодействовать как в рамках одной машины

    пайпы значительно быстрее


    > так и на разных машинах

    сокеты быстрее
  • krupt © (10.12.12 20:59) [7]

    > String, PChar и т.д. это указатели на данные.
    > Стало быть, передавай их не их самих, а непосредственно
    > то, на что они указывают.


    Блин. Чего-то не получается у меня. Получаю EAccessViolation.
  • Cobalt © (10.12.12 22:09) [8]
    Не показывай код, дождись когда подтянутся телепаты.
  • krupt © (12.12.12 21:20) [9]
    Клиент:
    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;

  • Германн © (12.12.12 21:40) [10]
    Навскидку
    SetLength(InString,PipeInstance^.ReadBuffSize);
    Move(PipeInstance^.ReadBuff[0], InString[1], PipeInstance^.ReadBuffSize);

  • Rouse_ © (12.12.12 22:18) [11]
    1. PipeClient.SendData - проверь, по памяти не помню, правит ли он позицию перед отправкой. Если нет, то выставляй ее в ноль перед вызовом
    2. Move(PipeInstance^.ReadBuff[0], InString, PipeInstance^.ReadBuffSize);
    Для начала желательно передавать размер строки и потом е саму, в противном случае поимееш проблем на склейке пакетов, ну есессно размер принимаещего буфера у тебя не выставлен, как и сказал Германн.
    3. тоже проверь, если принимающий буфер не требуется то и создавать OutStream не нужно

    ЗЫ: щас просто без кода сижу, поэтому по памяти все говорю...
  • krupt © (12.12.12 22:28) [12]
    Теперь AV нету, но принимает стоку коряво.

    Отправляю: "Edit1", получаю: "Edu".
    Отп.: "kak dela?", пол.: "kak dipe\"
  • krupt © (12.12.12 22:30) [13]
    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;

  • Rouse_ © (12.12.12 22:44) [14]
    Скорее всего тут проблема:
    InStream.WriteBuffer(Pointer(InString)^, Length(InString));
    строки юникодные?
  • krupt © (12.12.12 23:37) [15]

    > Скорее всего тут проблема:
    > InStream.WriteBuffer(Pointer(InString)^, Length(InString));
    >
    > строки юникодные?


    InString := Edit1.Text;


    Вроде нет
  • Rouse_ © (12.12.12 23:39) [16]

    > Вроде нет

    Ну мы ж не бабки-гадалки, сделай все свои строки в виде AnsiString и проверь...
  • krupt © (12.12.12 23:47) [17]
    Добавил инфо:
    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);
    {  PipeInstance^.WriteBuff[0] := PipeInstance^.ReadBuff[0];
     PipeInstance^.WriteBuffSize := PipeInstance^.ReadBuffSize;}

     WriteToFile('server.log', 'Str = ' + InString);
    end;



    При получении "Edit1" в файле имеется:
    Length = 5
    Str = Ed???
  • krupt © (12.12.12 23:49) [18]
    После изменения String на AnsiString получаю:

    Length = 5
    Str = ?????
  • Германн © (13.12.12 00:20) [19]

    > krupt ©   (12.12.12 23:49) [18]
    >
    > После изменения String на AnsiString получаю:

    В клиенте тоже такую замену сделал?
 
Конференция "WinAPI" » Выбор способа межпроцессного взаимодействия [D7, WinXP]
Есть новые Нет новых   [134430   +2][b:0][p:0.002]