Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

Нужен пример 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.091 c
15-1270727360
ElenKa
2010-04-08 15:49
2010.08.27
Мастер формул


2-1275132390
shkurkin
2010-05-29 15:26
2010.08.27
Ньюансы работы с COM-портами и асинхронный ввод/вывод


8-1205337835
Ramzes001
2008-03-12 19:03
2010.08.27
Запрет смены пропорций у фото


2-1271760916
Irisss
2010-04-20 14:55
2010.08.27
Панель иконок


15-1268472470
Незнайка на Луне
2010-03-13 12:27
2010.08.27
Как организовать своё время)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский