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

Вниз

Нужен пример CreateFileMapping()   Найти похожие ветки 

 
Franzy   (2009-02-19 17:20) [0]

Есть две программы (ехе), которые общаются между собой через запись файлов на диск (сначала запускается одна программа, она выполняется, записывает результаты расчетов в файл на диск), затем запускается вторая прога, которая считывает эти файлы и обрабатывает их, записывая результаты опять же в файлы. Но общение через диск - очень медленно (файлы по 20-100 МБ). Пытаюсь организовать работу прог на новом уровне. Скорее всего, будет одна управляющая прога, а две старые будут преобразованы в dll (следует иметь в виду, что они написаны на разных языках, на Фортране и Дельфях). Передачу данных планирую осуществлять через Memory-Mapped File.

Однако ни толковых примеров, ни нормальных статей по теме не нашел (по С++ полно, а по Дельфи нет), приходится полагаться на SDK, но там не очень понятно. Прошу уважаемых Мастеров посоветовать статьи или примеры, где бы был реализован похожий механизм.


 
Eraser ©   (2009-02-19 17:26) [1]

> Передачу данных планирую осуществлять через Memory-Mapped
> File.

очень советую использовать Named Pipe. скорость передачи там практически такая же, зато реализовать такой IPC на порядкок проще.


 
OlegNik ©   (2009-02-20 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 ©   (2009-02-20 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() и за раз решишь проблему.


 
Игорь Шевченко ©   (2009-02-20 16:56) [4]


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


Demos\IPCDemos


 
Rouse_ ©   (2009-02-26 10:11) [5]

http://rouse.drkb.ru/winapi.php#mmf


 
имя   (2009-03-31 13:04) [6]

Удалено модератором


 
имя   (2009-03-31 13:04) [7]

Удалено модератором



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

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

Наверх




Память: 0.48 MB
Время: 0.047 c
2-1272016997
SSD
2010-04-23 14:03
2010.08.27
Как зделать чтобы при входе в программу запршивал логин и пароль


2-1273563415
Uzer2010l
2010-05-11 11:36
2010.08.27
Коллизия обработчиков


2-1273477863
Elena
2010-05-10 11:51
2010.08.27
перенос exe-шника скомпилированный delphi 2009, на комп где delph


2-1266443303
Funtik
2010-02-18 00:48
2010.08.27
LIstBox


15-1270102589
AlexDan
2010-04-01 10:16
2010.08.27
Думаю поспамить