Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.04.14;
Скачать: [xml.tar.bz2];

Вниз

Проблема с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
3-1288195610
venator
2010-10-27 20:06
2013.04.14
Direct oracle access - помогите разобраться с ошибкой


15-1355337472
Игорь Шевченко
2012-12-12 22:37
2013.04.14
Люди, которые пишут begin..end вокруг одного оператора


15-1355847254
dummy_user
2012-12-18 20:14
2013.04.14
Как сделать удобный Dispose TList?


15-1355922292
картман
2012-12-19 17:04
2013.04.14
хочу 32 часа


2-1349379021
qwerty123
2012-10-04 23:30
2013.04.14
TreeView и системные иконки





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский