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

Вниз

Мьютексы   Найти похожие ветки 

 
zlo   (2010-07-28 15:49) [0]

для консольного приложения нужно запретить возможность повторного запуска. Сделал так:

program Updater;

{$APPTYPE CONSOLE}

uses
 Windows, SysUtils;
var
 Mutex: THandle;
begin
 Mutex := CreateMutex(nil, False, PChar(ExtractFileName(ParamStr(0))));
 try
   if GetLastError <> ERROR_ALREADY_EXISTS then
   begin
     // ...
   end;
 finally
   CloseHandle(Mutex);
 end;
end.

Нашел пример в котором указатель на имя mutex-object задан как: "E191BA0C41924AA9840243D5CAE346AF".
- Будет ли более правильным такой подход?
- Нужно ли делать CloseHandle, если функция CreateMutex возвращает 0. Может правильнее try..finally блок перенести в if?


 
12 ©   (2010-07-28 16:03) [1]


> PChar(ExtractFileName(ParamStr(0))));

менее уникально, чем, например, GUID


 
12 ©   (2010-07-28 16:05) [2]


> - Нужно ли делать CloseHandle, если функция CreateMutex
> возвращает 0. Может правильнее try..finally блок перенести
> в if?

а зачем его помнить?


 
zlo   (2010-07-28 16:07) [3]


> менее уникально, чем, например, GUID


OK. Тут ясно.


> а зачем его помнить?


т.е.?


 
Anatoly Podgoretsky ©   (2010-07-28 16:57) [4]

> zlo  (28.07.2010 15:49:00)  [0]

Какая тебе разница какое имя у мьютекса, я обычно использую GUID
Не нужно, мьютекс не создан.
У тебя явная ошибка с    if GetLastError <> ERROR_ALREADY_EXISTS then
Если функция вернет 0, то ты будешь работать с несозданым мьютексом, чего
естественно делать не надо, да и вызывать GetLastError до проверки на
создание мьютекса как бы тоже неправильно

if Mutex <> false  // я не помню объявления функции исхожу из того, что BOOL
иначе проверяй значения по списку или на = ERROR_ALREADY_EXISTS
 вот здесь и проверяй
else
 обработай ошибку

У тебя же будет пытать и при ERROR_INVALID_HANDLE и других ошибках


 
zlo   (2010-07-28 17:18) [5]

переписал. Для проверки заюзал функцию WaitForSingleObject. теперь правильно?


var
 Mutex: THandle;
begin
 Mutex := CreateMutex(nil, False, "{0AA1E4BE-7610-4195-A969-257D6E2F24A5}");
 if WaitForSingleObject(Mutex, 0) = 0 then
 begin
   try
     Readln;
   finally
     CloseHandle(Mutex);
   end;
 end;



Страницы: 1 вся ветка

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

Наверх




Память: 0.47 MB
Время: 0.009 c
2-1280316293
Danz1
2010-07-28 15:24
2010.10.24
СУБД в доп.потоке


3-1243308557
bdr
2009-05-26 07:29
2010.10.24
Как освободить каталог-базу Paradox?


2-1280317799
zlo
2010-07-28 15:49
2010.10.24
Мьютексы


15-1279257737
Ega23
2010-07-16 09:22
2010.10.24
Прювет из Крыма


15-1279190064
Novik
2010-07-15 14:34
2010.10.24
Современное телевидение