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

Вниз

Освобождение ресурса, занятого через 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 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.032 c
6-1180089084
inex
2007-05-25 14:31
2008.02.17
ftp прокси


15-1200149061
TUser
2008-01-12 17:44
2008.02.17
Turbo Delphi + Win 2003


2-1201155932
Василий К.
2008-01-24 09:25
2008.02.17
Extended в TThread и его деление...


6-1175272306
Adventure
2007-03-30 20:31
2008.02.17
TCPClient через прокси...


6-1178645354
flaxe
2007-05-08 21:29
2008.02.17
Съэмулировать клиент