Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.04.14;
Скачать: CL | DM;

Вниз

Проблема с memory-mapped file   Найти похожие ветки 

 
Kerk ©   (2012-12-18 17:42) [0]

На странную проблему наткнулся.

В процессе #1 делаю:

 FileHandle := CreateFileMapping(INVALID_HANDLE_VALUE, nil,  PAGE_READWRITE, 0, BufSize, PChar(FileName));
 FileBuf := MapViewOfFile(FileHandle, FILE_MAP_WRITE, 0, 0, 0);
 Move(Buf, FileBuf, BufSize);
 UnmapViewOfFile(FileBuf);
...


В процессе #2 делаю:

 FileHandle := OpenFileMapping(FILE_MAP_READ, True, PChar(FileName));
 FileBuf := MapViewOfFile(FileHandle, FILE_MAP_READ, 0, 0, 0);
 Move(FileBuf, Buf, BufSize);
...


Во втором процессе файл открывается, MapViewOfFile отрабатывает, но буфер пустой.
Чувствую, какую-то мелочь упускаю.


 
dummy_user   (2012-12-18 18:16) [1]

Если не секрет, для каких надобностей используете memory-mapped file?


 
брат Птибурдукова   (2012-12-18 18:17) [2]


> Move(Buf, FileBuf, BufSize)
Шапку не потерял?


 
Kerk ©   (2012-12-18 18:20) [3]


> dummy_user   (18.12.12 18:16) [1]

Между процессами данные передаю. Очевидно же из вопроса :)

> брат Птибурдукова   (18.12.12 18:17) [2]

Поясни-ка


 
брат Птибурдукова   (2012-12-18 18:22) [4]

Может так? Move(Buf^, FileBuf^, BufSize)


 
dummy_user   (2012-12-18 18:28) [5]


> Kerk ©   (18.12.12 18:20) [3]
>
>
> > dummy_user   (18.12.12 18:16) [1]
>
> Между процессами данные передаю. Очевидно же из вопроса
> :)


Про процессы очевидно.
А почему таким способом - нет.


 
Inovet ©   (2012-12-18 18:31) [6]

> [5] dummy_user   (18.12.12 18:28)
> А почему таким способом - нет.

Стоит подумать какие есть способы и какая между ними разница.


 
Kerk ©   (2012-12-18 18:32) [7]


> брат Птибурдукова   (18.12.12 18:22) [4]
> Может так? Move(Buf^, FileBuf^, BufSize)

На самом деле
  Move(Buf, FileBuf^, BufSize);

Но именно оно. Спасибо огромное!
Чувствовал, что какая-то мелочь, но замучался уже :)


 
Медвежонок Пятачок ©   (2012-12-18 18:34) [8]

LPVOID WINAPI MapViewOfFile(...

Move( const Source; var Dest; count : Integer );

Конечно домика не хватает


 
брат Птибурдукова   (2012-12-18 18:35) [9]


> А почему таким способом - нет.
Ненаказуемо! %-)


 
Kerk ©   (2012-12-18 18:37) [10]


> dummy_user   (18.12.12 18:28) [5]
>
> > Kerk ©   (18.12.12 18:20) [3]
> >
> >
> > > dummy_user   (18.12.12 18:16) [1]
> >
> > Между процессами данные передаю. Очевидно же из вопроса
>
> > :)
>
> Про процессы очевидно.
> А почему таким способом - нет.

Можно и другим. А данный конкретный чем не нравится?
Вроде удобно :)


 
Игорь Шевченко ©   (2012-12-18 18:55) [11]

Never attribute to malice... :)


 
Sapersky   (2012-12-18 21:46) [12]

Кстати, кто-нибудь пробовал передавать через мэп-файл большие объёмы данных?

Ну например, отмэплено 600 мб, один процесс использует эту память для работы как кольцевой буфер, другой забирает оттуда порциями по 30 мб. Плюс ещё около 600+300 мб расходуется неотмэпленной.

Через некоторое время свободная память у 32-битной Win7 заканчивается. Не то чтобы out of memory, но постоянный своп при попытке что-то ещё сделать. Отчего такое - непонятно, по расчётам 3 с лишним Гб должно хватать.

На 64 бита перейти пока не получается. Вариант "переписать всё нафиг с передачей меньших объёмов" рассматривается, но нежелателен.


 
Eraser ©   (2012-12-18 21:53) [13]


> Sapersky   (18.12.12 21:46) [12]

в свое время нужно было найти наиболее быстрый IPC. тестировал MMF в сравнении с named pipe - фактически тоже самое по скорости. не знаю как для твоей задачи, но почти во всех случаях pipes использовать куда удобнее.


 
Sha ©   (2012-12-18 22:02) [14]

> Sapersky   (18.12.12 21:46) [12]

работал с очень большим файлом (гигабайты),
мапил кусками по 64к без потери скорости


 
Игорь Шевченко ©   (2012-12-18 22:07) [15]

Sapersky   (18.12.12 21:46) [12]


> Кстати, кто-нибудь пробовал передавать через мэп-файл большие
> объёмы данных?


Вообще система пробует. Файловый кэш так организован. Вроде работает :)


 
Kerk ©   (2012-12-18 22:07) [16]


> Eraser ©   (18.12.12 21:53) [13]

Чем удобнее?


 
Eraser ©   (2012-12-19 09:07) [17]


> Kerk ©   (18.12.12 22:07) [16]

тем что не нужно самостоятельно городить механизм транспорта данных. в синхронном варианте все вообще примитивно - записал данные, считал данные, на другом конце - считал данные, записал данные. можно уложиться в 5 строк кода, грубо говоря.



Страницы: 1 вся ветка

Текущий архив: 2013.04.14;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
2-1349481129
Вова
2012-10-06 03:52
2013.04.14
как получить handle запускамемого приложения


2-1349793591
ixen
2012-10-09 18:39
2013.04.14
cxDBTreeList и поле колонки


15-1355806045
Cobalt
2012-12-18 08:47
2013.04.14
Окошко на верний уровень


15-1355826486
Error0xDEADBEEF
2012-12-18 14:28
2013.04.14
Оформление кода


2-1349538676
Wadimka
2012-10-06 19:51
2013.04.14
Можно-ли поменять DLL?