![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Освобождение ресурса, занятого через CreateFileMapping
DelphiN! © (2007-07-03 16:37:00)Создаю через 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;
В чем может быть проблема и как с этим бороться?
Инс (2007-07-06 18:56:00) [1]
> что мьютекс останется, так сказать, бесхозным..
Во-первых, тут проблема, как я понял, не с мьютексом, а с FileMapping. Во-вторых, безхозный мьютекс означает другое. Когда поток, владеющий мьютексом, завершается, не освободив его, мьютекс переходит в состояние "ничей" и поток, ждущий на этом мьютексе, просыпается. Но подсчет ссылок и закрытие хэндла тут ни причем.
Eraser (2007-07-06 12:34:00) [2]
> DelphiN! © (03.07.07 16:37)
где-то читал (у Рихтера возможно), что при использовании мьютексов может сложиться такая ситуация, что мьютекс останется, так сказать, бесхозным..
Инс (2007-07-03 17:07:00) [3]
> а почему не через CreateMutex?
FileMapping действительно может быть удобнее, в частности, туда можно записать хэндл окна, который при запуске второй копии, нужно развернуть и поместить на передний план.
DelphiN!
Странно. Даже при некорректном завершении процесса, система гарантированно освобождает ресурсы, при этом счетчик ссылок на FileMapping уменьшается. Если он становится равным нулю - система уничтожит объект. Так что, действительно, видимо кто-то еще его использует.
Игорь Шевченко (2007-07-03 16:58:00) [4]
> однако иногда(редко) бывает что после завершения процесса,
> идентификатор в памяти остается и система его не освобождает
Значит, остается второй процесс в памяти.
clickmaker (2007-07-03 16:54:00) [5]а почему не через CreateMutex?
DelphiN! (2007-07-03 16:40:00) [6]Извиняюсь код проверки выглядит так :
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;