2012-06-30 4 views
3

저는 Windows Forms 응용 프로그램에서 작업하고 있습니다. 다음 코드를 사용하여 버튼 클릭 이벤트에 대한 계산기 프로세스를 시작합니다.두 번 이상 실행중인 프로세스를 중지하는 방법

System.Diagnostics.Process.Start("calc.exe"); 

또 다른 계산기 프로세스가 시작됩니다. 그렇다면 프로세스가 두 번 이상 실행되지 않게하려면 어떻게해야합니까?

감사

+1

calc.exe의 실행중인 인스턴스를 확인할 수 있습니다.이 내용은 입니다. http://stackoverflow.com/questions/6392031/c-sharp-how-to-check-if-another-instance-of-the -application-is-running – yogi

+0

세 가지 일반적인 방법이 있습니다. 요기가 지적한 뮤텍스, 크리스 게슬러가 암시 한 클로즈업을 기다리는 비동기식 이미 실행중인 프로세스에 대한 다른 검사는 calc.exe의 인스턴스를 찾을 수 있습니다. 적합하지 않을 수있는 다른 prgram에 의해 calc가 실행됩니다. –

답변

3

는 간단하게, 기능을 확인하십시오 :

if (!IsProcessOpen("calc")) 
System.Diagnostics.Process.Start("calc.exe"); 
:이 과정을 확인하려는

public bool IsProcessOpen(string name) 
{ 
foreach (Process process in Process.GetProcesses()) 
{ 
if (process.ProcessName.Contains(name)) 
{ 
return true; 
} 
} 
return false; 
} 

지금이 기능을 사용

+1

감사합니다 쉽고 완벽하게 작동하는 ygs – kapil

5

쉬운 ... 프로세스가 죽을 때까지 버튼을 비활성화합니다. 물론 어떤 종류의 논리를 넣을 수도 있습니다.

if(!myProcess.HasExited) 
{ 
    alert("You've already started the calculator app."); 
} 
else 
{ 
    // start the process 
} 

저는 개인적으로 전자를 좋아합니다. 그냥 이벤트 핸들러를 설정하고 설정 :

Process.EnableRaisingEvents = true; 

이벤트 핸들러가 계산기 응용 프로그램이 종료 된 때 ​​proggy 알려주 발생합니다, 그래서 버튼을 다시 활성화 할 수 있습니다.

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.enableraisingevents.aspx

try 
{ 
    myProcess.EnableRaisingEvents = true; 
    myProcess.Exited += new EventHandler(myProcess_Exited); 
    myProcess.Start(); 
    // disable button 
} 
catch() 
{ 
    // enable button 
} 


private void myProcess_Exited(object sender, System.EventArgs e) 
{ 
    // enable button 
} 
2

당신은 Process.GetProcessesByName은() "CALC.EXE"라는 이름의 실행중인 프로세스를 검색하는 데 사용할 수 있습니다. 그러나 신뢰할 수는 없지만 프로세스 이름은 명확하지 않습니다. 동일한 .exe 이름으로 완전히 다른 프로세스가있을 수 있습니다.

좋은 방법은 프로세스를 시작하고 Process.Exited 이벤트로 프로세스를 추적하는 것입니다. 이처럼 : 어떤 프로세스가 실행중인 경우

Process calc; 

    private void button1_Click(object sender, EventArgs e) { 
     if (calc != null) return; 
     calc = new Process(); 
     calc.StartInfo = new ProcessStartInfo("calc.exe"); 
     calc.EnableRaisingEvents = true; 
     calc.Exited += new EventHandler(calc_Exited); 
     calc.SynchronizingObject = this; 
     calc.Start(); 
     button1.Enabled = false; 
    } 

    void calc_Exited(object sender, EventArgs e) { 
     calc.Exited -= calc_Exited; 
     calc = null; 
     button1.Enabled = true; 
    } 
0

일반적으로 이렇게하면 응용 프로그램의 첫 번째 인스턴스로 컨트롤을 전송하여 자신을 활성화 할 수 있습니다. 그렇지 않으면 응용 프로그램을 시작한 사람이 무슨 일이 일어나고 있는지 계속 알 수 없습니다.

당신은 뮤텍스를 생성하여이를 구현 할 수있을 때의 라인을 따라 응용 프로그램 출시, 상기에

bool mine = false; 
Mutex mutex = new Mutex(true, "Something to identify this", out mine); 
if (!mine) 
    // Application is already running 

응용 프로그램이 2 번 실행하면, 뮤텍스가 이미 존재하고 다음 사용할 수 있습니다 sendMessage 첨부 초기 응용 프로그램을 활성화해야합니다.

이 작업의 예는 here입니다.

관련 문제