해봤는데 제일 아래껏만 제대로 작동됨.
Mutex를 이용한 프로세스 통제
실행파일을 여러 번 실행하면 여러 개의 다른 프로세스들이 생성되는데 만약 해당 머시에서 오직 한 프로세스만 실행되도록하길 원한다면, 일반적으로 사용되는 한 방법으로 Mutex를 사용 할 수 있다. Mutex는 프로세스간 동기화 (Sychronization)을 위해 사용되는데, .NET Framework에는 System.Threading.Mutex라는 클래스가 구현되어 있다.
- //뮤텍스 생성
- Mutex m = new Mutex();
- //뮤텍스를 획득할 때까지 대기
- m.WaitOne();
- //뮤텍스 해제
- m.ReleaseMutext();
단일 프로세스만 실행 예제
아래는 머신에서 오직 한 프로세스만 사용하기 위한 예제이다. 머신 전체적으로 한 프로세스만 뜨게 하귀해, 고유의 Mutex명을 체크할 필요가 있는데, 이를 위해 GUID ( Globally Unique Idenrtifier)를 사용하였다. 처음 프로세스가 먼저 Mutex를 획득한 후에는, 그 프로세스가 죽기 전에는 머신 전체적으로 다른 프로세스가 Mutex를 획득할 수 없다는 점을 이요하여 잠시 (1초) 체크해 보고 이미 다른 프로세스가 Mutex를 가지고 있으면, 프로세스를 중단시키다.
GUID는 사용자가 임의적으로 명시 할 수 있다.
- using System;
- using System.Windows.Forms;
- using System.Threading;
- namespace WindowsFormsApplication1
- {
- static class Program
- {
- [STAThread]
- static void Main()
- {
- // GUID를 뮤텍스명으로 사용
- //string mtxName = "4AD31D94-659B-44A7-9277-1DD793E415D1";
- // GUID 대신 사용자 임의대로 뮤텍스 이름 사용
- string mtxName = "Metashower";
- Mutex mtx = new Mutex(true, mtxName);
- // 1초 동안 뮤텍스를 획득하려 대기
- TimeSpan tsWait = new TimeSpan(0, 0, 1);
- bool success = mtx.WaitOne(tsWait);
- // 실패하면 프로그램 종료
- if (!success)
- {
- MessageBox.Show("이미실행중입니다.");
- return;
- }
- // 성공하면 폼 실행
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(false);
- Application.Run(new Form1());
- }
- }
- }
다음처럼 TimeSpan을 사용하지 않고 바로 사용 할수도 있다.
- static void Main()
- {
- bool bnew;
- Mutex mutex = new Mutex(true, "MutexName", out bnew);
- if(bnew)
- {
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(false);
- Application.Run(new Form1());
- mutex.ReleaseMutex();
- }
- else
- {
- MessageBox.Show("프로그램이 실행중입니다.");
- Application.Exit();
- }
- }
'개발 > C#' 카테고리의 다른 글
[이미지] C# 이미지위에 다른이미지 올려 마우스로 이동하기 (0) | 2018.02.07 |
---|---|
[이미지] C# PictureBox 움직이기 (0) | 2018.02.07 |
[이미지] C# 이미지 회전 (0) | 2018.02.07 |
[이미지] C# 이미지 끌어다 놓기(Drag and Drop) (0) | 2018.02.07 |
[그래픽] C# 영역 캡춰하기 (0) | 2018.02.05 |
[팁] 폼 상단바 클릭 이벤트 (0) | 2018.02.02 |
[팁] C# FormBorderStyle None 에서 폼 사이즈 조절하기 (4) | 2018.02.01 |
[팁] C# 듀얼모니터에서 현재 실행된 위치에서 새창열기 (0) | 2018.01.29 |