Главная страница
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.024 c
1-1194779709
mufan
2007-11-11 14:15
2008.02.17
TreeView.Items.Clear не работает???


2-1200392049
rys
2008-01-15 13:14
2008.02.17
как написать html редактор


15-1200477585
Washington
2008-01-16 12:59
2008.02.17
Компонент типа CheckListBox


15-1200562674
ZoldBerger
2008-01-17 12:37
2008.02.17
МОДЕРАТОР !!! Почему так сделал:?


2-1201254130
abhtr
2008-01-25 12:42
2008.02.17
WinExec непонятно работает