Q&A

  • Mutex 관련 질문입니다.
프로젝트 부분에 코딩되어있는 내용입니다.

=====================================================================
var
  Mutex : THANDLE;
  mutexname  : String;


begin
  try
    mutexname := Application.ExeName;
    mutex := openMutex (0,false , PChar(mutexname));
    if (mutex = 0) then
    begin
      Mutex := CreateMutex(NIL,true , PChar(mutexname));
    end
    else
    begin
      Application.MessageBox('이미 프로그램이 실행중입니다.  ' , '경고', MB_OK+MB_ICONWARNING);
      Exit;
    end;

    FrmLogo := TFrmLogo.Create(Application);
    try
      FrmLogo.Show;
      FrmLogo.Update;
      Application.Initialize;
      Application.Title := 'app';
      Application.CreateForm(TFrmMainMenu, FrmMainMenu);
      :
      :
      Application.CreateForm(TFormMSG, FormMSG);
      FrmLogo.Hide;
    finally
      FrmLogo.Free;
    end;
    Application.Run;

  except
    Application.MessageBox('Mutex 를 열수 없습니다.' , '경고', MB_OK+MB_ICONWARNING);
  end;
  ReleaseMutex(mutex);
end.
===================================================================

이런식으로 mutex를 사용하는데 간혹 'mutex를 열수없습니다.'라는
에러가 발생합니다. 계속 잘 사용중인 프로그램에서도 한번 발생하여
그 담부터 계속 mutex를 열수없다는 메시지가 발생하더군요.
(한번 발생하면 컴퓨터를 리붓해도 소용없음.)
결국 이전에 백업해둔 프로그램으로 돌리는데 이건 또 됩니다.
같은 프로그램인데 말이죠....-_-;;;

혹시 제가 mutex를 잘못사용한걸까요?
아니면 mutex를 제대로 클리어 못한걸까요?
4  COMMENTS
  • Profile
    David 2003.05.15 23:35
    중복 실행 방지... 전 이렇게 하고 있습니다.

    프로제트 파일을 아래와 같이....

    program Project1;

    uses
      Forms,
      Windows,
      Unit1 in 'Unit1.pas' {Form1};

    var
       Mutex : THandle;

    {$R *.res}

    begin
       Mutex := CreateMutex(nil, True, 'noDuplicate');
       if (Mutex <> 0 ) and (GetLastError = 0) then begin
          Application.Initialize;
          
          Application.CreateForm(TForm1, Form1);
          Application.Run;

          if Mutex <> 0 then
             CloseHandle(Mutex);
       end;
    end.



  • Profile
    이종직 2003.05.16 00:44
    답변 감사드립니다.

    참고토록하겠습니다.
  • Profile
    KDDG_ZZOM 2003.05.15 23:06
    Mutex는 잘모르고요...^^
    님이 원하는게 중복실행방지인것같은데...
    이방법이 제일 편한것같네요...

    program Test;

    uses
      Forms, windows, dialogs,
      tllf in 'Test.pas' {TForm1};

    {$R *.RES}

    begin
      Application.Initialize;
      CreateFileMapping( $FFFFFFFF, nil, PAGE_READWRITE, 0,
                               1024, '본인이원하는아무값이나쓰세요' );
      if GetLastError=ERROR_ALREADY_EXISTS then
      begin
        ShowMessage('이미 실행되어 있습니다.');
        halt; //application 을 죽인다.
      end;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.

  • Profile
    이종직 2003.05.16 00:45
    답변 감사합니다.

    참고토록하겠습니다.