1. Visual Studio 를 켜고 메뉴에서 파일 -> 새로 만들기 -> Project 를 선택
C# Windows Forms 응용 프로그램 열어 줍니다.
2. 아래의 그림과 같이 오른쪽 솔루션 탐색기에서 Program.cs 파일을 더블 클릭 하여 소스를 열어 줍니다.
3. Program.cs 파일 Main() 함수 안에 중복 코드 구현
//이미 프로그램이 실행 중 일때...
System.Diagnostics.Process[] processes = null;
string strCurrentProcess = System.Diagnostics.Process.GetCurrentProcess().ProcessName.ToUpper();
processes = System.Diagnostics.Process.GetProcessesByName(strCurrentProcess);
if (processes.Length > 1)
{
MessageBox.Show(string.Format("'{0}' 프로그램이 이미 실행 중입니다.", System.Diagnostics.Process.GetCurrentProcess().ProcessName));
return;
}
또는 Form1.cs 안에서 구현 가능 합니다.
//이미 프로그램이 실행 중 일때...
System.Diagnostics.Process[] processes = null;
string strCurrentProcess = System.Diagnostics.Process.GetCurrentProcess().ProcessName.ToUpper();
processes = System.Diagnostics.Process.GetProcessesByName(strCurrentProcess);
if (processes.Length > 1)
{
MessageBox.Show(string.Format("'{0}' 프로그램이 이미 실행 중입니다.", System.Diagnostics.Process.GetCurrentProcess().ProcessName));
Application.Exit();
}
다만 둘 차이가 Program.cs 안에서는 return 으로 끝나지만 Form1.cs 안에서는 Application.Exit() 로 끝난다는 점 입니다.
Program.cs 안에서는 보시는 바와 같이 메인 함수 안에서 아직 어플리케이션이 시작 전에 있기 때문에 그렇고
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace CSharp_Delay
{
public partial class Form1 : Form
{
//지연 시간 잴 변수...
DateTime dtDelayStart;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
dtDelayStart = DateTime.Now;
//지연 함수 사용...
//5초간 지연
DelaySystem(5000);
//System.Threading.Thread.Sleep(5000);
//지연 시간 구하기...
TimeSpan ts = DateTime.Now - dtDelayStart;
lblTime.Text = ts.Seconds.ToString();
}
private void button2_Click(object sender, EventArgs e)
{
lbl.Text = "지연 시간 중 버튼 Click...";
}
//지연 함수...
private void DelaySystem(int MS)
{
/* 함수명 : DelaySystem
* 1000ms = 1초
* 전달인자 : 얼마나 지연시킬것인가에 대한 변수
* */
DateTime dtAfter = DateTime.Now;
TimeSpan dtDuration = new TimeSpan(0, 0, 0, 0, MS);
DateTime dtThis = dtAfter.Add(dtDuration);
while (dtThis >= dtAfter)
{
//DoEvent () 를 사용 해서 지연 시간 동안
//버튼 클릭 이벤트 및 다른 윈도우 이벤트를 받을 수 있게끔 하는 역할
//없으면 지연 동안 다른 이벤트를 받지 못함...
System.Windows.Forms.Application.DoEvents();
//현재 시간 얻어 오기...
dtAfter = DateTime.Now;
}
}
}
}
위 소스 예제를 보면 DelaySystem 함수 안 While 문 에 Application.DoEvents() 함수가 있습니다.
DoEvents() 함수 가 있고 없고 차이는 예제를 따라 하면서 주석 처리를 하시면 확연한 결과를 보실 수 있습니다.
주석에서 설명 드렸듯 윈도우의 다른 이벤트를 받을 수 있고 없고 인데 딜레이 함수 만드는 이유는
타이밍을 늦게 잡기 위해 딜레이 함수 밑에 코드 구현 구문을 조금 지연 시킨 뒤 실행 하고 싶으실 때
그럼 System.Threading.Thread.Sleep() 으로 하면 되지 않나 싶지만 이 또한 딜레이 함수에 DoEvents() 가 없는
결과와 같습니다.
하지만 DoEvents() 함수의 남발한 사용 및 사용 위치에 따라 상상하지 못한 결과를 얻으실 수도 있습니다.
* 예제 결과
말씀 드렸듯 지연함수는 그대로 돌고 있으며 다른 버튼을 클릭 했을 때의 이미지 입니다. DoEvents() 가 없이 저 버튼을