Конференция "WinAPI" » Нужен пример CreateFileMapping()
 
  • Franzy (19.02.09 17:20) [0]
    Есть две программы (ехе), которые общаются между собой через запись файлов на диск (сначала запускается одна программа, она выполняется, записывает результаты расчетов в файл на диск), затем запускается вторая прога, которая считывает эти файлы и обрабатывает их, записывая результаты опять же в файлы. Но общение через диск - очень медленно (файлы по 20-100 МБ). Пытаюсь организовать работу прог на новом уровне. Скорее всего, будет одна управляющая прога, а две старые будут преобразованы в dll (следует иметь в виду, что они написаны на разных языках, на Фортране и Дельфях). Передачу данных планирую осуществлять через Memory-Mapped File.

    Однако ни толковых примеров, ни нормальных статей по теме не нашел (по С++ полно, а по Дельфи нет), приходится полагаться на SDK, но там не очень понятно. Прошу уважаемых Мастеров посоветовать статьи или примеры, где бы был реализован похожий механизм.
  • Eraser © (19.02.09 17:26) [1]
    > Передачу данных планирую осуществлять через Memory-Mapped
    > File.

    очень советую использовать Named Pipe. скорость передачи там практически такая же, зато реализовать такой IPC на порядкок проще.
  • OlegNik © (20.02.09 15:51) [2]
    вот так примерно

    var
      hObj : THandle;
    Address : PChar;
    {выделяешь}
    function SetMemory(): Integer;
    begin
      hObj := CreateFileMapping(DEF_ALL,nil,PAGE_READWRITE,0,DEF_KILOBYTE*1024,'SharedValue');
      if (hObj = 0) then begin
          result := 0;
          _LastError := SysErrorMessage(GetLastError());
          Exit;
      end;
      Address := MapViewOfFile(hObj,FILE_MAP_WRITE,0,0,0);
      if (Address = nil) then begin
          result := 0;
          _LastError := SysErrorMessage(GetLastError());
          Exit;
      end;
    end;

    {считываешь}
       Move(Address[0],SMemory,SizeOf(TStructMemory));
    {записываешь}
       Move(SMemory,Address[0],SizeOf(TStructMemory));

    {освобождаешь}
    function ClearMemory(): Integer;
    begin
       UnMapViewOfFile(Address);
       CloseHandle(hObj);
    end;

    но здесь проблема с синхронизацией, однако если у тебя одна основная и
    2 dll то вставь в dll функции типа пораread(); пораwrite() и за раз решишь проблему.
  • OlegNik © (20.02.09 15:52) [3]
    вот так примерно

    var
      hObj : THandle;
    Address : PChar;
    {выделяешь}
    function SetMemory(): Integer;
    begin
      hObj := CreateFileMapping(DEF_ALL,nil,PAGE_READWRITE,0,DEF_KILOBYTE*1024,'SharedValue');
      if (hObj = 0) then begin
          result := 0;
          _LastError := SysErrorMessage(GetLastError());
          Exit;
      end;
      Address := MapViewOfFile(hObj,FILE_MAP_WRITE,0,0,0);
      if (Address = nil) then begin
          result := 0;
          _LastError := SysErrorMessage(GetLastError());
          Exit;
      end;
    end;

    {считываешь}
       Move(Address[0],SMemory,SizeOf(TStructMemory));
    {записываешь}
       Move(SMemory,Address[0],SizeOf(TStructMemory));

    {освобождаешь}
    function ClearMemory(): Integer;
    begin
       UnMapViewOfFile(Address);
       CloseHandle(hObj);
    end;

    но здесь проблема с синхронизацией, однако если у тебя одна основная и
    2 dll то вставь в dll функции типа пораread(); пораwrite() и за раз решишь проблему.
  • Игорь Шевченко © (20.02.09 16:56) [4]

    > Нужен пример CreateFileMapping()


    Demos\IPCDemos
  • Rouse_ © (26.02.09 10:11) [5]
  • имя (31.03.09 13:04) [6]
    Удалено модератором
  • имя (31.03.09 13:04) [7]
    Удалено модератором
 
Конференция "WinAPI" » Нужен пример CreateFileMapping()
Есть новые Нет новых   [134435   +35][b:0][p:0]