Авторизация

Логин: Пароль:
Регистрация Забыли свой пароль?

Как можно сделать, чтобы при запуске проверялась запущено ли приложение или нет?

Страницы: 1
Как можно сделать, чтобы при запуске проверялась запущено ли приложение или нет?
У меня программа читает в слух определенный текст( воспроизводит с wav файла). Запускает ее девочка оператор, вот иногда она ошибается и сразу запускает несколько копий программы и тут начинается многоголосие. Первое что пришло в голову сделать аналог pid файла как в *nix системах, проверять, если файл есть значит уже программа работает, если нет то сами создаем этот файл.

Еще может у кого варианты будут какие по решению этой задачки?
Можно например привлечь мютексы

xHand:=CreateMutex(nil,false,'LinkCI');
If (GetLastError = ERROR_ALREADY_EXISTS) then
begin
MessageDlg(' Óæå çàïóùåíî! ',mtInformation, [mbOk], 0);
ReleaseMutex(xHand);
Application.Terminate;
end;
Вот примерчик из одного моего приложения...
В Delphi смотри Project\View Source (код который выполняется до запуска приложения smile;))
if FindWindow('<указатель на имя класса>', '<указатель на имя окна>')=0
then
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.Title := '<у каждого свое>';
Application.CreateForm(TForm1, Form1);
Application.Run;
end
else
begin
MessageDlg('Программа уже запущена.', mtInformation, [mbOK], 0);
Application.Terminate;
end;
Грубо говоря здесь проверяется существует ли такое окно... Если да то приложение завершается.
В своё время перепробовал много способов, этот мне показался самым простым и эффективным...
Врядли есть еще одно такое приложение, с таким точно именем класса и именем окна smile;)
Цитата
Valera пишет:
Вот примерчик из одного моего приложения...
Код
if FindWindow('<указатель на имя класса>', '<указатель на имя окна>')=0
  then…


А не сбойнет ли FindWindow, если, скажем приложение отображает имя открытого файла в своем заголовке, а мы запускаем еще один экземпляр приложения, но уже с другим файлом?
Не знаю, не проверял smile:)
Но это как вариант и в определённых случаях этого способа будет достаточно...
Как вариант сканировать запущенные процессы и проверять есть ли твой там или нет. Но это не самый быстрый способ
свободный страннык
Можно сделать метку в реестре и проверять её, если программа запущена, то выдавать сообщение о ошибке, а по закрытию удалять метку из реестра.
пока ты не доволен жизнью - она проходит...
a9d, плохая идея. Ибо умные люди смогут убрать такую метку. А если прога заглючит в процессе выполнения и её надо будет завершить, то запись в реестре останется.
свободный страннык
Зато можно будет в начале программы стирать ее, если она там вдруг осталась smile:) Но вообще операции с реестром обычно делаются довольно медленно
Accende lumen sensibus, infude ainorem corbidus!
Цитата
motorway11 пишет:
Зато можно будет в начале программы стирать ее, если она там вдруг осталась Но вообще операции с реестром обычно делаются довольно медленно


Не самая лучшая идея. К примеру в висте и 7ке есть 2 режима запуска программы, от пользователя и от администратора. Допустим ваша программа хранит свои данные в реестре в HKEY_LOCAL_MACHINE. При запуске от администратора программа обращаясь к реестру будет работать непосредственно с головной веткой HKLM, но если программа будет запущенна от пользователя, тогда программа будет работать в псевдо ветке HKLM, которая храниться где то в недрах реестра. (кому очень интересно найдете).
Цитата
kenny пишет:
a9d, плохая идея. Ибо умные люди смогут убрать такую метку. А если прога заглючит в процессе выполнения и её надо будет завершить, то запись в реестре останется.

Кому понадобится убирать эту метку? Девочке-оператору?
Если программа заглючит, тогда придется удалить метку.
Этот способ довольно простой в реализации.
пока ты не доволен жизнью - она проходит...
Вот ещё один способ smile;)

...
uses syncobjs;
...
var
CheckEvent: TEvent;

...

procedure TForm1.FormCreate(Sender: TObject);
begin
CheckEvent := TEvent.Create(nil, false, true, 'MYPROGRAM_CHECKEXIST');
if CheckEvent.WaitFor(10) <> wrSignaled then
begin
Self.Close;
end;
end;

И ссылочка чтобы во всём разобраться:
http://skachivaem.ru/articles/50-delphi/257-delphi.html
Вот тут в интернете откопал код.
Код
program Previns;
uses
  WinTypes,
  WinProcs,
  SysUtils,
  Forms,
  Uprevins in 'UPREVINS.PAS' {Form1};
{$R *.RES}

type
  PHWND = ^HWND;

function EnumFunc(Wnd: HWND; TargetWindow: PHWND): bool; export;
var
  ClassName: array[0..30] of char;
begin
  Result := true;
  if GetWindowWord(Wnd, GWW_HINSTANCE) = hPrevInst then
  begin
    GetClassName(Wnd, ClassName, 30);
    if StrIComp(ClassName, 'TApplication') = 0 then
    begin
      TargetWindow^ := Wnd;
      Result := false;
    end;
  end;
end;

procedure GotoPreviousInstance;
var
  PrevInstWnd: HWND;
begin
  PrevInstWnd := 0;
  EnumWindows(@EnumFunc, Longint(@PrevInstWnd));
  if PrevInstWnd <> 0 then
    if IsIconic(PrevInstWnd) then
      ShowWindow(PrevInstWnd, SW_RESTORE)
    else
      BringWindowToTop(PrevInstWnd);
end;

begin
  if hPrevInst <> 0 then
    GotoPreviousInstance
  else
  begin
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end;
end.
свободный страннык
Вообще довольно часто программы, удаляющие различный мусор, могут исправлять ошибки в реестре и в принципе могут стереть и такие метки, если им это покажется странным. Но вероятность этого, наверно, не очень большая, если нормально сделано
Accende lumen sensibus, infude ainorem corbidus!
motorway11,да эту идею с реестром вообще лучше сразу забыть. Вот я предложил код. Конечно я его не проверял, но на вид кажется вполне рабочим.
свободный страннык
Страницы: 1
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)