반응형
FA 장비 소프트웨어에서 중복 실행 방지는 단순한 편의 기능이 아니라 '필수 안전장치(Safety Interlock)'입니다.
카메라 프레임 그래버(Frame Grabber)나 PLC 통신 포트(COM/Socket)는 기본적으로 독점(Exclusive) 연결을 요구합니다. 만약 작업자가 실수로 아이콘을 두 번 눌러 프로그램이 두 개 켜지면, 두 프로세스가 하나의 하드웨어에 동시에 접근하려다 장비가 뻗거나 블루스크린이 발생할 수 있습니다.
.NET Framework 환경에서 이를 OS 레벨에서 완벽하게 차단하는 가장 확실한 방법인 Mutex (Mutual Exclusion, 상호 배제) 객체를 활용하여 Program.cs를 업데이트해 보겠습니다.
Step 1: 현업용 코드 (The Solution)
프로젝트 루트 폴더에 있는 Program.cs를 열고 다음 코드로 완전히 덮어씌우십시오.
using System;
using System.Threading;
using System.Windows.Forms;
using OmniVisionFramework.UI; // 분리된 UI 폴더 참조
namespace OmniVisionFramework
{
internal static class Program
{
// OS 전역에서 식별할 고유한 Mutex 이름 (보통 프로젝트 명이나 GUID를 사용)
private const string MutexName = "Global\\OmniVisionFramework_Mutex_24x7";
/// <summary>
/// 해당 애플리케이션의 주 진입점입니다.
/// </summary>
[STAThread]
static void Main()
{
// out 매개변수(C# 7.0+)를 활용하여 코드를 간결하게 작성
// createdNew가 true이면 최초 실행, false이면 이미 실행 중임을 의미
using (var mutex = new Mutex(true, MutexName, out bool createdNew))
{
if (!createdNew)
{
// 1. 이미 실행 중인 경우 경고창 띄우고 즉시 종료
MessageBox.Show("비전 제어 프로그램이 이미 실행 중입니다.\n작업 표시줄을 확인해 주세요.",
"중복 실행 방지 (OmniVisionFramework)",
MessageBoxButtons.OK,
MessageBoxIcon.Warning);
return; // Application.Run을 타지 않고 프로세스 종료
}
// 2. 최초 실행인 경우 정상적으로 폼 로드
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
}
}
Step 2: 코드 분석 (Code Breakdown)
- Mutex를 활용한 OS 레벨 락(Lock): * Mutex는 단순한 변수가 아니라 Windows 운영 체제(OS)가 직접 관리하는 커널 객체(Kernel Object)입니다.
- MutexName 앞에 "Global\\" 접두사를 붙인 이유는, 장비 PC에 여러 사용자 계정(예: Admin, Operator)이 로그인되어 있더라도 계정과 무관하게 물리적인 PC 전체에서 오직 하나의 프로세스만 실행되도록 완벽히 차단하기 위함입니다.
- 방어적 리소스 관리 (using 블록):
- Mutex 역시 OS의 Unmanaged 리소스를 소모합니다. 따라서 using 블록으로 감싸주어 프로그램이 정상 종료되든, 치명적 예외로 강제 종료되든 OS가 Mutex를 확실하게 회수(Release)하도록 보장합니다. 이렇게 해야 프로그램이 죽은 뒤 "이미 실행 중입니다"라는 메시지가 뜨면서 재실행이 안 되는 이른바 '좀비 현상'을 막을 수 있습니다.
반응형