ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C# 윈폼 타이머를 이용한 스탑워치
    C# 2020. 8. 20. 15:57

     

    타이머를 이용한 스탑워치 기능을 구현하기 위해서 timer를 두개 사용했다.

    timer 1,2

    timer1에는 단순한 덧셈연산만 하고 timer2에서는 조건문을 통한 label의 텍스트를 바꿔주는 부분을 넣었다.

    timer1은 1/1000초마다 동작, timer2는 1/10초 마다 동작

     

    덧셈 연산에서 지연이 발생하면 정확한 시간 측정이 어렵다.

     

    전역변수로는

    private int CountMS = 0;
    private int CountS = 0;
    private int CountM = 0;
    int a = 1;
    private bool Toggle = false;

    밀리초 덧셈을 위한 CountMS

    초 덧셈을 위한 CountS

    분 덧셈을 위한 CountM

    기록하면 앞에 들어갈 숫자인 a

    시작 정지를 위한 toggle이다 false이면 멈춤, true면 시간 덧셈이 된다.

     

    private void timer1_Tick(object sender, EventArgs e)
            {
                ++CountMS;
                if (CountMS == 60)
                {
                    CountMS = 0;
                    ++CountS;
    
                    if (CountS == 60)
                    {
                        CountS = 0;
                        ++CountM;
                    }
                }
            }
    private void timer2_Tick(object sender, EventArgs e)
            {
    
                DispM.Text = CountM.ToString();
                DispS.Text = CountS.ToString();
                DispMS.Text = CountMS.ToString();
            }
    

     

    타이머의 틱 이벤트들이다. 지연을 줄이기 위해 timer2는 디스플레이만 담당, timer1은 시간연산만 담당

    원래는 CountMS가 1000이어야 1초가되지만 각종 조건문과 연산 때문에 느려져서 대강 MS=60이면 1초라고 판단한다.

    (이게 제일 엇비슷했다.)

    초가 60이면 분이 올라가고 초가 0으로 초기화 되는 것을 볼 수 있다.

     

     

     

    private void button1_Click(object sender, EventArgs e)
            {
                if(Toggle==false)
                {
                    timer1.Start();
                    timer2.Start();
                    Toggle = true;
                }
                else            {
                    timer1.Stop();
                    timer2.Stop();
                    Toggle = false;
                }
            }

     시작 정지버튼의 이벤트 메소드이다. Toggle의 조건에 따라 멈춰있다면 타이머가 시작하고, 타이머가 돌고 있다면 타이머를 멈춘다. 

     

     

     

    private void button2_Click(object sender, EventArgs e)
            {
                string str = "";
                
                label1.Text += a.ToString()+". "+CountM.ToString() + " " + UnitM.Text + " " + CountS.ToString()+ " " + UnitS.Text+ " " + CountMS.ToString() + UnitMS.Text + " \n";
                ++a;
            }

    기록 부분이다. 대강 스톱워치에 기록버튼을 누르면 그 시간이 고대로 옆에 하나씩 기록되는 것을 볼 수 있다. 그런 느낌으로 만들었다. string에 하나씩 이어붙이는데 끝에 \n를 위치시켜서 줄바꿈을 해줬고, 순위가 나오도록 a를 사용했다.

     

     private void button3_Click(object sender, EventArgs e)
            {
                timer1.Stop();
                timer2.Stop();
                Toggle = false;
                CountM = 0;
                CountS = 0;
                CountMS = 0;
                DispM.Text = CountM.ToString();
                DispS.Text = CountS.ToString();
                DispMS.Text = CountMS.ToString();
                label1.Text = "";
                a = 1;
    
            }

     리셋 버튼이다. 시간을 재고있던 변수 다 0으로 만들고 타이머 2개 stop하고 토글도 false로 해준다. 기록해놓은 레이블도 다 날리고 순위를 저장해놓은 a도 1로 바꾼다.

     

     

     

    'C#' 카테고리의 다른 글

    C# 숫자야구 윈폼  (0) 2020.08.20
    C# 윈폼 DateTimePicker와 Tab 컨트롤을 사용한 알람시계  (0) 2020.08.20
    C# 기초 정리  (0) 2020.06.25
    C# DB연동  (0) 2020.06.18
    C# 윈폼 Chart 컨트롤  (0) 2020.06.18
Designed by Tistory.