Microsoft MVP성태의 닷넷 이야기
.NET Framework: 197. .NET 코드 - 단일 Process 실행 [링크 복사], [링크+제목 복사],
조회: 31073
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 3개 있습니다.)
.NET 코드 - 단일 Process 실행

Pomodoro Timer를 만드는데, 역시 이 기능도 필요하게 되었습니다.

[C#] 단일 Process 실행
; http://www.jumptovb.net/entry/C-%EB%8B%A8%EC%9D%BC-Process-%EC%8B%A4%ED%96%89

위에서 보는 것처럼, VB.NET은 프로젝트 설정 창에서 "단일 인스턴스 응용 프로그램 작성"이라는 옵션을 자동으로 제공해 줍니다. 그리고, 설명과 함께 제공되는 링크가 하나 있는데요.

How to make sure that there is one instance of the application is running
; http://stackoverflow.com/questions/391339/how-to-make-sure-that-there-is-one-instance-of-the-application-is-running

위의 질문/답변에서 제시되는 해결책은 2가지가 있습니다. 하나는 "Named Mutex"를 이용한 방법과 다른 하나는 "현재 실행 중인 응용 프로그램 검색"을 통한 방법입니다.




사실 대개의 경우, "두 번째" 프로그램을 실행했을 때 정말 중복 실행이 되지 않는 것도 중요하지만, UX적인 측면을 고려해 보면 사용자에게 이전에 실행해 둔 프로그램이 팝업되어 보여지는 기능이 필요할 수 있습니다. 그런 방식으로 구현하려면 "현재 실행 중인 응용 프로그램 검색"은 기능이 다소 모자랍니다. "Named Mutex"를 쓰는 것이 더 간단할 수 있습니다.

저 같은 경우에는 (Named)EventWaitHandle 타입을 이용해서 아래와 같이 구현해 보았습니다.

namespace PomodoroTimer
{
    static class Program
    {
        public static EventWaitHandle s_ewh;
        static bool bRun = true;
        [STAThread]
        static void Main()
        {
            try
            {
                s_ewh = EventWaitHandle.OpenExisting("OneInstance.ThisProgram");
                if (s_ewh != null)
                {
                    s_ewh.Set();
                    return;
                }
            }
            catch
            {
            }

            if (s_ewh == null)
            {
                s_ewh = new EventWaitHandle(false, EventResetMode.AutoReset, "OneInstance.ThisProgram");
            }

            Thread thread = new Thread(WaitInstanceEvent);
            thread.IsBackground = true;
            thread.Start();

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());

            bRun = false;
            s_ewh.Set();
        }

        static void WaitInstanceEvent(object state)
        {
            while (bRun)
            {
                s_ewh.WaitOne();

                // 윈도우 복원                
            }
        }
    }
}

첨부한 예제 코드는 위의 기능이 정상적으로 구현된 프로젝트입니다.



[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 8/6/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 121  122  123  124  125  126  127  128  129  130  131  [132]  133  134  135  ...
NoWriterDateCnt.TitleFile(s)
1816정성태11/20/201423161.NET Framework: 484. Mono Profiler에서 IL 코드 변경이 가능할까?
1815정성태11/18/201421163.NET Framework: 483. 코드로 살펴 보는 ETW의 활성화 시점 [2]
1814정성태11/18/201422741오류 유형: 263. Unable to find the requested .Net Framework Data Provider. It may not be installed.
1813정성태11/18/201424418오류 유형: 262. Build Events에 robocopy 작업이 있는 경우 "VCEnd exited with code 3" 오류 발생
1812정성태11/17/201422412.NET Framework: 482. ETW 자동 생성 코드의 VerificationException 예외 발생
1811정성태11/16/201423691.NET Framework: 481. Mono 내부의 문자열 처리 방식은 UTF-8
1810정성태11/15/201460811.NET Framework: 480. C# - 배치 파일 실행하고 출력 결과를 얻는 방법 [4]
1809정성태11/11/201425409.NET Framework: 479. Mono Profiler를 Unity의 Plugin으로 사용하는 방법
1808정성태11/11/201425656.NET Framework: 478. C# - 폴더 경로 문자열에서 "..", "." 표기를 고려한 최종 문자열을 얻는 방법 [2]
1807정성태11/10/201432394개발 환경 구성: 250. 서버용 Socket에서 사용하는 포트가 충돌한다면?파일 다운로드1
1806정성태11/10/201428131.NET Framework: 477. SeCreateGlobalPrivilege 특권과 WCF NamedPipe
1805정성태11/5/201424814.NET Framework: 476. Visual Studio에서 Mono용 Profiler 개발 [3]파일 다운로드1
1804정성태11/5/201431083.NET Framework: 475. ETW(Event Tracing for Windows)를 C#에서 사용하는 방법 [9]파일 다운로드1
1803정성태11/4/201421947오류 유형: 261. Windows Server Backup 오류 - Error in backup of E:\$Extend\$RmMetadata\$TxfLog
1802정성태11/4/201424997오류 유형: 260. 이벤트 로그 - Windows Error Reporting / AEAPPINVW8
1801정성태11/4/201430633오류 유형: 259. 이벤트 로그 - Windows Error Reporting / IPX Assertion / KorIME.exe [1]
1800정성태11/4/201420823오류 유형: 258. 이벤트 로그 - Starting a SMART disk polling operation in Automatic mode.
1799정성태11/4/201425589오류 유형: 257. 이벤트 로그 - The WMI Performance Adapter service entered the stopped state.
1798정성태11/4/201434024오류 유형: 256. 이벤트 로그 - The WinHTTP Web Proxy Auto-Discovery Service service entered the stopped state. [1]
1797정성태11/4/201420073오류 유형: 255. 이벤트 로그 - The Adobe Flash Player Update Service service entered the stopped state.
1796정성태10/30/201427296개발 환경 구성: 249. Visual Studio 2013에서 Mono 컴파일하는 방법
1795정성태10/29/201429152개발 환경 구성: 248. Lync 2013 서버 설치 방법
1794정성태10/29/201424748개발 환경 구성: 247. "Microsoft Office 365 Enterprise E3" 서비스에 대한 간략 소개
1793정성태10/27/201425676.NET Framework: 474. C# - chromiumembedded 사용 - 두 번째 이야기 [2]파일 다운로드1
1792정성태10/27/201425704.NET Framework: 473. WebClient 객체에 쿠키(Cookie)를 사용하는 방법
1791정성태10/22/201425268VC++: 83. G++ - 템플릿 클래스의 iterator 코드 사용에서 발생하는 컴파일 오류 [5]
... 121  122  123  124  125  126  127  128  129  130  131  [132]  133  134  135  ...