반응형

* 지연(Delay) 함수 예제

 

메인화면

Form1.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() 가 없이 저 버튼을

클릭 하였다면 5초뒤에 이벤트가 실행되는 현상을 보실 수 있습니다.

 

결과 화면

 

반응형

+ Recent posts