본문 바로가기
delphi

뮤텍스를 이용한 세션에 상관없이 중복 실행방지 방법

by doran365 2024. 7. 31.

개요

프로그램이 실행될 때, 같은 프로그램이 이미 실행 중인지 확인하고 중복 실행을 방지하는 것은 매우 중요합니다. 이를 통해 시스템 자원의 낭비를 줄이고, 사용자 경험을 향상시킬 수 있습니다. 본 문서에서는 뮤텍스(Mutex)를 이용하여 세션에 상관없이 중복 실행을 방지하는 방법을 자세히 설명하겠습니다.

뮤텍스란?

뮤텍스(Mutex)는 "Mutual Exclusion"의 약자로, 동시에 여러 스레드나 프로세스가 특정 자원에 접근하지 못하도록 하기 위한 동기화 객체입니다. 뮤텍스를 사용하면 하나의 프로세스가 자원을 사용하고 있을 때, 다른 프로세스가 해당 자원에 접근하는 것을 막을 수 있습니다. 이를 통해 데이터의 일관성을 유지하고 충돌을 방지할 수 있습니다.

뮤텍스를 이용한 중복 실행 방지 방법

1. 뮤텍스 생성

먼저, 뮤텍스를 생성하는 방법을 알아보겠습니다. Windows API를 사용하여 뮤텍스를 생성할 수 있습니다. 아래는 CreateMutex 함수를 사용하여 뮤텍스를 생성하는 예제입니다.

hMutex := CreateMutex(nil, True, 'Global\KPFTransfer');

2. 중복 실행 여부 확인

뮤텍스가 이미 존재하는지 확인하기 위해 GetLastError 함수를 사용합니다. 만약 ERROR_ALREADY_EXISTS 오류 코드가 반환되면, 이미 동일한 프로그램이 실행 중임을 의미합니다.

if (0 <> hMutex) and (ERROR_ALREADY_EXISTS = GetLastError) then
begin
  strMsg := '이미 "KPFTransfer.exe"가 실행중입니다. 기존 프로세스를 종료한 이후에 다시 실행하여 주십시요.';
  MessageBox(0, PChar(strMsg), PChar(TITLE_STRING), MB_OK or MB_ICONSTOP);
  Exit;
end;

3. 주의사항

뮤텍스를 생성할 때, "Global" 접두어를 사용하면 전역 뮤텍스를 생성할 수 있습니다. 이는 세션에 상관없이 동일한 이름의 뮤텍스를 공유할 수 있도록 합니다. 다만, Windows 2000에서는 이 방법이 동작하지 않으므로 주의가 필요합니다.

뮤텍스 사용의 장점

1. 자원 관리의 효율성

뮤텍스를 사용하면 특정 자원에 대한 동시 접근을 막을 수 있어 자원을 효율적으로 관리할 수 있습니다. 이를 통해 자원의 낭비를 줄이고 시스템의 성능을 향상시킬 수 있습니다.

2. 데이터 일관성 유지

여러 프로세스나 스레드가 동시에 데이터를 변경하려고 할 때, 데이터의 일관성이 깨질 수 있습니다. 뮤텍스를 사용하면 이러한 문제를 방지할 수 있어 데이터의 일관성을 유지할 수 있습니다.

3. 사용자 경험 향상

프로그램의 중복 실행을 방지하면 사용자에게 명확한 메시지를 제공할 수 있습니다. 이를 통해 사용자 경험을 향상시키고, 프로그램의 신뢰성을 높일 수 있습니다.

뮤텍스 구현 예제

아래는 Delphi를 사용하여 뮤텍스를 구현한 예제 코드입니다.

program PreventDuplicateExecution;

uses
  Windows, SysUtils;

const
  TITLE_STRING = 'Transfer';

var
  hMutex: THandle;
  strMsg: string;

begin
  hMutex := CreateMutex(nil, True, 'Global\Transfer');
  if (0 <> hMutex) and (ERROR_ALREADY_EXISTS = GetLastError) then
  begin
    strMsg := '이미 "Transfer.exe"가 실행중입니다. 기존 프로세스를 종료한 이후에 다시 실행하여 주십시요.';
    MessageBox(0, PChar(strMsg), PChar(TITLE_STRING), MB_OK or MB_ICONSTOP);
    Exit;
  end;

  // 프로그램의 메인 로직 실행
  // ...

  // 프로그램 종료 시 뮤텍스 해제
  CloseHandle(hMutex);
end.

결론

뮤텍스를 이용한 중복 실행 방지는 시스템 자원을 효율적으로 관리하고, 데이터의 일관성을 유지하며, 사용자 경험을 향상시키는 데 매우 유용합니다. 위에서 설명한 방법을 참고하여, 여러분의 프로그램에서도 중복 실행을 방지해 보시기 바랍니다.