Форум: "WinAPI";
Текущий архив: 2008.02.17;
Скачать: [xml.tar.bz2];
ВнизОсвобождение ресурса, занятого через CreateFileMapping Найти похожие ветки
← →
DelphiN! © (2007-07-03 16:37) [0]Создаю через CreateFileMapping в памяти идентификатор того, что программа уже запущена, однако иногда(редко) бывает что после завершения процесса, идентификатор в памяти остается и система его не освобождает, в следствии чего я не могу запустить свою программу повторно!
Проверку на наличие приложения в памяти сделал следующим образом :
var
AppFM: Integer;
procedure TDATA.DataModuleCreate(Sender: TObject);
begin
AppFM:= CreateFileMapping($ffffffff,nil, PAGE_READONLY,0,32,"OMGSHELL");
if (GetLastError = ERROR_ALREADY_EXISTS)and(HaveProces("OSG_Shell.exe")) then
halt; //Proga uje zapushena
...
end;
В чем может быть проблема и как с этим бороться?
← →
DelphiN! © (2007-07-03 16:40) [1]Извиняюсь код проверки выглядит так :
var
AppFM: Integer;
procedure TDATA.DataModuleCreate(Sender: TObject);
begin
AppFM:= CreateFileMapping($ffffffff,nil, PAGE_READONLY,0,32,"OMGSHELL");
if (GetLastError = ERROR_ALREADY_EXISTS) then
halt; //Proga uje zapushena
...
end;
← →
clickmaker © (2007-07-03 16:54) [2]а почему не через CreateMutex?
← →
Игорь Шевченко © (2007-07-03 16:58) [3]
> однако иногда(редко) бывает что после завершения процесса,
> идентификатор в памяти остается и система его не освобождает
Значит, остается второй процесс в памяти.
← →
Инс © (2007-07-03 17:07) [4]
> а почему не через CreateMutex?
FileMapping действительно может быть удобнее, в частности, туда можно записать хэндл окна, который при запуске второй копии, нужно развернуть и поместить на передний план.
DelphiN!
Странно. Даже при некорректном завершении процесса, система гарантированно освобождает ресурсы, при этом счетчик ссылок на FileMapping уменьшается. Если он становится равным нулю - система уничтожит объект. Так что, действительно, видимо кто-то еще его использует.
← →
Eraser © (2007-07-06 12:34) [5]
> DelphiN! © (03.07.07 16:37)
где-то читал (у Рихтера возможно), что при использовании мьютексов может сложиться такая ситуация, что мьютекс останется, так сказать, бесхозным..
← →
Инс © (2007-07-06 18:56) [6]
> что мьютекс останется, так сказать, бесхозным..
Во-первых, тут проблема, как я понял, не с мьютексом, а с FileMapping. Во-вторых, безхозный мьютекс означает другое. Когда поток, владеющий мьютексом, завершается, не освободив его, мьютекс переходит в состояние "ничей" и поток, ждущий на этом мьютексе, просыпается. Но подсчет ссылок и закрытие хэндла тут ни причем.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2008.02.17;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.051 c