powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Количество открытых хэндлов Mapped File
12 сообщений из 12, страница 1 из 1
Количество открытых хэндлов Mapped File
    #40057233
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения, что вопрос не совсем про дельфи, но я не знаю куда его засунуть, а использую я сабж.

Есть приложение, которое использует Shared Memory через Mapped File. Хочется иметь возможно для того чтобы обнулить этот участок памяти при выполнении некоторого условия во всех экземплярах приложения. Простейший подход: хранить там же счётчик и изменять его - мне не нравится, т.к. если приложение будет убито через диспетчер задач, например, то вся цепочка навернётся. Отсюда появилась идея и вопрос: можно ли как-то узнать сколько раз открыт хэндл на эту область памяти?.. Ведь при уничтожении приложения оперционная система его автоматически закрывает AFAIK?..

Открывается оно как-то так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  FMappedSize := MAX_DATA_SIZE;
  FMappingFile := OpenFileMapping(FILE_MAP_READ, False, PChar(ObjectName));
  if (FMappingFile = 0) and (GetLastError = ERROR_FILE_NOT_FOUND) then
  begin
    FMappingFile := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, FMappedSize, PChar(ObjectName));
    ZeroMemory;
  end else
    FExisting := True;
  if FMappingFile = 0 then
    RaiseLastOSError;
...
Рейтинг: 0 / 0
Количество открытых хэндлов Mapped File
    #40057240
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Хочется иметь возможно для того чтобы обнулить этот участок памяти при выполнении некоторого условия во всех экземплярах приложения.
Так обнуляй. В чем проблема?
alekcvp
можно ли как-то узнать сколько раз открыт хэндл на эту область памяти?
Допустим можно, а что это тебе даст? Через миллисекунду все может поменяться
alekcvp
Код: pascal
1.
2.
    FMappingFile := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, FMappedSize, PChar(ObjectName));
    ZeroMemory;

Это лишнее. При создании области ее обнуляет сама ОС
...
Рейтинг: 0 / 0
Количество открытых хэндлов Mapped File
    #40057247
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
alekcvp
Хочется иметь возможно для того чтобы обнулить этот участок памяти при выполнении некоторого условия во всех экземплярах приложения.
Так обнуляй. В чем проблема?
Проблема: как узнать что он больше не нужен ни одному экземпляру приложения?..

_Vasilisk_
alekcvp
можно ли как-то узнать сколько раз открыт хэндл на эту область памяти?
Допустим можно, а что это тебе даст? Через миллисекунду все может поменяться
Для этого есть всякие мутексы и т.п. Главный вопрос - как этот момент поймать?..
...
Рейтинг: 0 / 0
Количество открытых хэндлов Mapped File
    #40057250
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpПроблема: как узнать что он больше не нужен ни одному экземпляру приложения?..

Счётчик ссылок, защищённый мутексом. И да, придётся позаботиться чтобы в защищённом куске кода не было ничего, способного "навернуть приложение".
...
Рейтинг: 0 / 0
Количество открытых хэндлов Mapped File
    #40057252
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
alekcvpПроблема: как узнать что он больше не нужен ни одному экземпляру приложения?..

Счётчик ссылок, защищённый мутексом. И да, придётся позаботиться чтобы в защищённом куске кода не было ничего, способного "навернуть приложение".
Хм... точно, можно же при отключении закрыть хэндл мутекса и тут же пытаться его снова создать: если удастся - значит это был последний экземпляр. Спасибо за идею.
...
Рейтинг: 0 / 0
Количество открытых хэндлов Mapped File
    #40057257
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpможно же при отключении закрыть хэндл мутекса и тут же пытаться его снова создать: если
удастся - значит это был последний экземпляр.

Увы, но "был" совсем не гарантирует "всё ещё". Между созданием и очисткой вполне может
вклиниться второе подключение, которое увидит грязную память.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Количество открытых хэндлов Mapped File
    #40057261
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

alekcvpможно же при отключении закрыть хэндл мутекса и тут же пытаться его снова создать: если
удастся - значит это был последний экземпляр.

Увы, но "был" совсем не гарантирует "всё ещё". Между созданием и очисткой вполне может
вклиниться второе подключение, которое увидит грязную память.

Но для этого ему придётся сначала создать или захватить этот мутекс самому. И он либо сможет это сделать, а значит память чистить не надо, либо нет, а значит она будет очищена. Этот же мутекс будет использоваться для синхронизации доступа к этой памяти.
...
Рейтинг: 0 / 0
Количество открытых хэндлов Mapped File
    #40057267
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Проблема: как узнать что он больше не нужен ни одному экземпляру приложения?
Когда все хэндлы закроются память сама очистится. Проблема так и не ясна
...
Рейтинг: 0 / 0
Количество открытых хэндлов Mapped File
    #40057268
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Когда все хэндлы закроются память сама очистится.

Где-то гарантируется что именно очистится , а не просто пометится как свободная?..
...
Рейтинг: 0 / 0
Количество открытых хэндлов Mapped File
    #40057270
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpГде-то гарантируется что именно *очистится*

Да: https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createfilemappinga

Не думаешь же ты, что вменяемый разработчик ОС позволит тебе получить доступ к грязным
страницам свопа вместе с содержащимися там данными других приложений?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Количество открытых хэндлов Mapped File
    #40057279
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Ну да, в принципе наверное этого хватит, спасибо.
...
Рейтинг: 0 / 0
Количество открытых хэндлов Mapped File
    #40057303
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе, если прочесть всё, что написано по ссылке, у тебя вообще половину кода можно
выкинуть и оставить один вызов CreateFileMapping().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Количество открытых хэндлов Mapped File
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]