Главная страница
    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.061 c
15-1270569642
HRustBB
2010-04-06 20:00
2010.08.27
Не нарушу ли я авторские права компании Borland если...


15-1263977721
картман
2010-01-20 11:55
2010.08.27
Обработка ошибок


3-1226323378
DSKalugin
2008-11-10 16:22
2010.08.27
Авторизация в DataSnap/SOAP


15-1273613051
bd
2010-05-12 01:24
2010.08.27
usb hdd перестал определяться


2-1274247722
Petr
2010-05-19 09:42
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский