본문 바로가기
머신비전(Machine Vision)/C# Framework 만들기

1. 중복실행 방지.

by 공부봇 2026. 5. 25.
반응형

 

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)하도록 보장합니다. 이렇게 해야 프로그램이 죽은 뒤 "이미 실행 중입니다"라는 메시지가 뜨면서 재실행이 안 되는 이른바 '좀비 현상'을 막을 수 있습니다.
반응형