Главная страница
    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.085 c
15-1267824303
xayam
2010-03-06 00:25
2010.08.27
Эволюция восприятия реальности


15-1270742112
denis_stell
2010-04-08 19:55
2010.08.27
количество дней


15-1268222361
@!!ex
2010-03-10 14:59
2010.08.27
Самый быстрый C++ компилятор


2-1265715158
webpauk
2010-02-09 14:32
2010.08.27
Проблема с отображением TLabel в TScrollBox


15-1264145710
Дмитрий С
2010-01-22 10:35
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский