![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нужен пример CreateFileMapping()
Franzy © (2009-02-19 17:20:00)Есть две программы (ехе), которые общаются между собой через запись файлов на диск (сначала запускается одна программа, она выполняется, записывает результаты расчетов в файл на диск), затем запускается вторая прога, которая считывает эти файлы и обрабатывает их, записывая результаты опять же в файлы. Но общение через диск - очень медленно (файлы по 20-100 МБ). Пытаюсь организовать работу прог на новом уровне. Скорее всего, будет одна управляющая прога, а две старые будут преобразованы в dll (следует иметь в виду, что они написаны на разных языках, на Фортране и Дельфях). Передачу данных планирую осуществлять через Memory-Mapped File.
Однако ни толковых примеров, ни нормальных статей по теме не нашел (по С++ полно, а по Дельфи нет), приходится полагаться на SDK, но там не очень понятно. Прошу уважаемых Мастеров посоветовать статьи или примеры, где бы был реализован похожий механизм.
(2009-03-31 13:04:00) [1]Удалено модератором
(2009-03-31 13:04:00) [2]Удалено модератором
Rouse_ (2009-02-26 10:11:00) [3]http://rouse.drkb.ru/winapi.php#mmf
Игорь Шевченко (2009-02-20 16:56:00) [4]
> Нужен пример CreateFileMapping()
Demos\IPCDemos
OlegNik (2009-02-20 15:52:00) [5]вот так примерно
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:51:00) [6]вот так примерно
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() и за раз решишь проблему.
Eraser (2009-02-19 17:26:00) [7]> Передачу данных планирую осуществлять через Memory-Mapped
> File.
очень советую использовать Named Pipe. скорость передачи там практически такая же, зато реализовать такой IPC на порядкок проще.