Форум: "Начинающим";
Текущий архив: 2010.10.24;
Скачать: [xml.tar.bz2];
ВнизМьютексы Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.003 c