![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Мьютексы
zlo © (2010-07-28 15:49:00)для консольного приложения нужно запретить возможность повторного запуска. Сделал так:
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?
zlo (2010-07-28 17:18:00) [1]переписал. Для проверки заюзал функцию 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;
Anatoly Podgoretsky (2010-07-28 16:57:00) [2]> 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 16:07:00) [3]
> менее уникально, чем, например, GUID
OK. Тут ясно.
> а зачем его помнить?
т.е.?
12 (2010-07-28 16:05:00) [4]
> - Нужно ли делать CloseHandle, если функция CreateMutex
> возвращает 0. Может правильнее try..finally блок перенести
> в if?
а зачем его помнить?
12 (2010-07-28 16:03:00) [5]
> PChar(ExtractFileName(ParamStr(0))));
менее уникально, чем, например, GUID