Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2011, 11:33   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию Не проверять Mutex если программа запущена с параметром

Добрый день/ночь!

В общем ситуация:
Пользователи требовали чтобы по их желанию программу можно было запустить n-раз.

Чтобы этоо не допустить я писал такой код:
Код:
function CheckMutex(aName: string): Boolean;
var
  HM: Thandle;
begin
  HM := OpenMutex(MUTEX_ALL_ACCESS, false, PAnsiChar(aName));
  Result := (HM <> 0);
    if HM = 0 then
    CreateMutex(nil, false, PAnsiChar(aName));
end;
Но теперь проблема, нужно если в коммандной строке стоит параметр "-nosingle", то мютекс вообще не создавался и не проверялся.

Проверяю это так:
Код:
  if not RunParams('nosingle') then
  begin
    if CheckMutex(mYMutex_name) then
    begin
      HLR_MsgBox(RsMsgOnlyOne, MB_OK or MB_ICONWARNING);
      Exit;
    end;
  end;
Проблема такова что, мютекс как-ни крути всеравно создаётся. И последующие копии детектят его и не запускаются.
Как это обойти?

Последний раз редактировалось Человек_Борща; 09.05.2011 в 11:36.
Человек_Борща вне форума Ответить с цитированием
Старый 09.05.2011, 11:39   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
RunParams('nosingle')
Как устроена?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.05.2011, 11:50   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

просто:
Код:
function RunParams(Opt: string): Boolean;
var
  i: SmallInt;
begin
  Result := False;
  for i := 0 to ParamCount - 1 do
    if (LowerCase(ParamStr(i)) = LowerCase('-' + opt)) or
      (LowerCase(ParamStr(i)) = LowerCase('/' + opt)) then
      Result := True;
end;
Человек_Борща вне форума Ответить с цитированием
Старый 09.05.2011, 12:08   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вроде в RunParams все корректно. А в пошаговой трассировке не пробовали?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.05.2011, 12:30   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Вы не туда смотрите

Дело в том что в данном коде:
Код:
  if not RunParams('nosingle') then
  begin
    if CheckMutex(mYMutex_name) then
    begin
      HLR_MsgBox(RsMsgOnlyOne, MB_OK or MB_ICONWARNING);
      Exit;
    end;
  end;
как ни крути а мютекс создаётся ибо:
Код:
function CheckMutex(aName: string): Boolean;
var
  HM: Thandle;
begin
  HM := OpenMutex(MUTEX_ALL_ACCESS, false, PAnsiChar(aName));
  Result := (HM <> 0);
    if HM = 0 then
    CreateMutex(nil, false, PAnsiChar(aName));
end;
Как этого избежать? И при параметре -nosingle вообще н создавать и не проверять наличие мютекса?
Человек_Борща вне форума Ответить с цитированием
Старый 09.05.2011, 12:42   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Дошло. Я бы сделал так - кто вошел с nosingle пытается создать мьютекс и не зависимо от того, удалось или нет - все равно входит в программу (при выходе - грохают мьютекс только в случае если они его создали), остальные - входят только если удалось создатьЮ Понятно создать с предварительной проверкой на существование
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 09.05.2011 в 12:46.
Аватар вне форума Ответить с цитированием
Старый 09.05.2011, 12:48   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
И при параметре -nosingle вообще н создавать и не проверять наличие мютекса?
Так у тебя при -nosingle в эту ветку выполнение не заходит.

А ошибка у тебя в RunParams - при единственном параметре она всегда будет возвращать False.

P.S. Твой RunParams - это стандартная FindCmdLineSwitch.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 09.05.2011, 13:01   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Точно ошибка была где указал GunSmoker! Огроменное спасибо!

Заменил на:
Код:
function RunParams(Opt: string): Boolean;
begin
  Result := FindCmdLineSwitch(Opt,['-','/'],True);
end;
Все спасибо! всем +.
Человек_Борща вне форума Ответить с цитированием
Старый 09.05.2011, 13:04   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
А ошибка у тебя в RunParams - при единственном параметре она всегда будет возвращать False.
А разве в ParamStr(0) не торчит имя exe-шника и ParamCount не равно 1 при отсутсвии параметров?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.05.2011, 13:07   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
разве в ParamStr(0) не торчит
Торчит.

Цитата:
ParamCount не равно 1 при отсутсвии параметров?
С чего бы функции, возвращающей количество параметров командной строки, возвращать единицу при отсутствии параметров?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа запущена с сетевой папки Ma4balaka Общие вопросы Delphi 2 10.02.2011 16:11
Определить, что программа запущена и корректно её завершить Casper-SC Общие вопросы .NET 3 24.12.2010 23:12
Как узнать деректорию откуда запущена программа? dolphin705 Общие вопросы Delphi 4 22.03.2009 19:32
Как проверять, запущена ли определенная программа? Bill Gates Общие вопросы Delphi 1 04.01.2008 17:29
Запущена программа или нет Маркъ Общие вопросы Delphi 6 05.02.2007 18:21