-
Есть две программы (ехе), которые общаются между собой через запись файлов на диск (сначала запускается одна программа, она выполняется, записывает результаты расчетов в файл на диск), затем запускается вторая прога, которая считывает эти файлы и обрабатывает их, записывая результаты опять же в файлы. Но общение через диск - очень медленно (файлы по 20-100 МБ). Пытаюсь организовать работу прог на новом уровне. Скорее всего, будет одна управляющая прога, а две старые будут преобразованы в dll (следует иметь в виду, что они написаны на разных языках, на Фортране и Дельфях). Передачу данных планирую осуществлять через Memory-Mapped File.
Однако ни толковых примеров, ни нормальных статей по теме не нашел (по С++ полно, а по Дельфи нет), приходится полагаться на SDK, но там не очень понятно. Прошу уважаемых Мастеров посоветовать статьи или примеры, где бы был реализован похожий механизм.
-
> Передачу данных планирую осуществлять через Memory-Mapped > File.
очень советую использовать Named Pipe. скорость передачи там практически такая же, зато реализовать такой IPC на порядкок проще.
-
вот так примерно
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() и за раз решишь проблему.
-
вот так примерно
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() и за раз решишь проблему.
-
> Нужен пример CreateFileMapping()
Demos\IPCDemos
-
-
Удалено модератором
-
Удалено модератором
|