문과 코린이의, [C#] 기록/C# 활용

[문과 코린이의 IT 기록장] C# 기초 예시 - Timer

벼리네 2021. 6. 28. 10:20
반응형

[문과 코린이의 IT 기록장] C# 기초 예시 - Timer

[문과 코린이의 IT 기록장] C# 기초 예시 - Timer


0. C# _ Timer에 대해서

 ex. 게임 데이터 같은 부분에서 활용됨

[ Timer의 종류 ]

1) System.Windows.Forms.Timer (=timer) 

- 가장 기본적인 타이머 (Winform의 기본)

- 별도의 Thread를 사용하지 않고 Form 자체의 Single Thread를 사용함. (따라서 Form에서만 호추 가능)

- 시간에 맞춰서 함수만 호출해 주는 역할을 하기 때문에, 함수 호출 중에는 프로그램이 멈춤.

2) System.Threading.Timer, System.Timers.Timer

- 멀티 Thread를 사용

- 직접 호출이 안 되고, Invoke 대리자를 활용해 호출해야 함

3) System.Windows.Threading.Dispatcher.Timer

- WPF에서만 사용 가능

 


1. UI 부분

 * label (0들어간 부분) - Auto size(false)로 만들어 주기


2. 코드 부분

1) 전역 변수 

private double iTick = 0; // 한 Tick당 더할 값
private double iTotal = 0; // 전체 값을 저장할 변수

private int i1Add = 1; // 1*Level -> 1을 클릭했을 때 한 Tick 당 더해질 값
private int i1Level = 1; // 1에 대해 몇 번을 클릭했는지를 저장할 변수

private int i3Add = 0; // 3*Level -> 3을 클릭했을 때 한 Tick 당 더해질 값
private int i3Level = 0; // 3에 대해 몇 번을 클릭했는지를 저장할 변수

private int i50Add = 0; // 50*Level -> 50을 클릭했을 때 한 Tick 당 더해질 값
private int i50Level = 0; // 50에 대해 몇 번을 클릭했는지를 저장할 변수

2) 폼이 로드되는 시점 - Timer 

[ Timer 클래스 ]

- 반복 이벤트를 생성하는 옵션으로, 설정된 간격 후 이벤트를 생성한다.

# Timer.Enabled 속성 : Timer가 실행 중인지 여부를 나타내는 값을 가져오거나 설정한다.

# Timer.Interval 속성 : 이벤트(몇 초마다 타이머를 작동)를 발생시킬 간격(밀리초)를 가져오거나 설정한다.

 ex. 1000 - 1초, 100 - 0.1초

# Timer.Start() 메서드 : Enabled를 True로 설정하여, 이벤트를 발생시킨다.

// 폼이 로드되는 시점 (=프로그램을 실행시키자마자) 타이머 실행
private void Form1_Load(object sender, EventArgs e)
{
    Timer oTimer = new Timer(); // Timer 객체 생성 및 초기화
    oTimer.Enabled = true;
    oTimer.Interval = 100; // 0.1초 간격으로 실행
    oTimer.Tick += OTimer_Tick;
    oTimer.Start();
}

// 타이머에서 호출할 Event (Interval 간격 기준)
private void OTimer_Tick(object sender, EventArgs e)
{
    iTick = i1Add + i3Add + i50Add; // 한 Tick당 더할 값 = 1을 클릭했을 때 더해질 값(1*i1Level) + 3을 클릭했을 때 더해질 값(3*i3Level) + 50을 클릭했을 때 더해질 값(50*i50Level)
    
    iTotal = iTotal + iTick; // 전체 값(한 Tick) = 전체값(한 Tick) + 한 Tick당 더해질 값

    lblTikPoint.Text = string.Format("{0} (1 : {1}), (3 : {2}), (50 : {3})", iTick.ToString(),i1Level.ToString(),i3Level.ToString(),i50Level.ToString());
    // 점수 표시

    lblTotal.Text = iTotal.ToString();
}

3) Add버튼(+1,+3,+50)을 클릭했을 때 

[ Form_Designer.cs ]

- Form1_Designr.cs에 들어가서, btn1Add, btn2Add, btn3Add를 하나의 기능인 btnAdd로 묶어주기

- 클릭 이벤트를 하나로 묶어 통일해줌 (같은 목적의 버튼들은 하나로 모아도 됨)

/* Form_Designer.cs 부분의 코드입니다. 기존 Form에서 진행되던 코드가 아닙니다. */
// 
// btn1Add
// 
this.btn1Add.Location = new System.Drawing.Point(17, 215);
this.btn1Add.Name = "btn1Add";
this.btn1Add.Size = new System.Drawing.Size(241, 33);
this.btn1Add.TabIndex = 1;
this.btn1Add.Text = "+1";
this.btn1Add.UseVisualStyleBackColor = true;
this.btn1Add.Click += new System.EventHandler(this.btnAdd_Click); // 기존의 this.btn1Add를 수정
// 
// btn3Add
// 
this.btn3Add.Location = new System.Drawing.Point(17, 263);
this.btn3Add.Name = "btn3Add";
this.btn3Add.Size = new System.Drawing.Size(241, 33);
this.btn3Add.TabIndex = 2;
this.btn3Add.Text = "+3";
this.btn3Add.UseVisualStyleBackColor = true;
this.btn3Add.Click += new System.EventHandler(this.btnAdd_Click); // 기존의 this.btn3Add를 수정
// 
// btn50Add
// 
this.btn50Add.Location = new System.Drawing.Point(17, 314);
this.btn50Add.Name = "btn50Add";
this.btn50Add.Size = new System.Drawing.Size(241, 33);
this.btn50Add.TabIndex = 3;
this.btn50Add.Text = "+50";
this.btn50Add.UseVisualStyleBackColor = true;
this.btn50Add.Click += new System.EventHandler(this.btnAdd_Click); // 기존의 this.btn50Add를 수정

 

[ btnAdd_Click ]

private void btnAdd_Click(object sender, EventArgs e) 
{
    Button obtn = sender as Button; // 받아온 sender를 button형으로 형변환함

    switch (obtn.Name) // 버튼의 이름에 맞게 조건 수행
    {
        case "btn1Add": // btn1Add 버튼을 누른다면
            if (iTotal > 100) // 만약 iTotal이 100보다 크다면
            {
                iTotal = iTotal - 100; 
                i1Level++; // i1Level : 1을 몇 번 클릭했는지에 관한 변수 (즉 1에 대한 점수)
                i1Add = 1 * i1Level; // iAdd : 1을 클릭했을 때 한 Tick 당 더해질 값
            }
            break;

        case "btn3Add": // btn3Add 버튼을 누른다면
            if (iTotal > 300) // 만약 iTotal이 300보다 크다면
            {
                iTotal = iTotal - 300;
                i3Level++; // i3Level : 3을 몇 번 클릭했는지에 관한 변수 (즉 3에 대한 점수)
                i3Add = 3 * i3Level; // i3Add : 3을 클릭했을 때 한 Tick 당 더해질 값
            }
            break;

        case "btn50Add": // btn50Add 버튼을 누른다면
            if (iTotal > 5000) // 만약 iTotal이 5000보다 크다면
            {
                iTotal = iTotal - 5000;
                i50Level++; // i50Level : 50을 몇 번 클릭했는지에 관한 변수 (즉 50에 대한 점수)
                i50Add = 50 * i50Level; // i50Add : 50을 클릭했을 때 한 Tick 당 더해질 값
            }
            break;

        default:
            break;
    }
}

[ 전체 코드 ]

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _20210627_Timer
{
    public partial class Form1 : Form
    {
        private double iTick = 0; 
        private double iTotal = 0; 

        private int i1Add = 1; 
        private int i1Level = 1; 

        private int i3Add = 0;
        private int i3Level = 0;

        private int i50Add = 0;
        private int i50Level = 0;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Timer oTimer = new Timer(); 
            oTimer.Enabled = true;
            oTimer.Interval = 100;
            oTimer.Tick += OTimer_Tick;
            oTimer.Start();
        }
        
        private void OTimer_Tick(object sender, EventArgs e)
        {
            iTick = i1Add + i3Add + i50Add;
            iTotal = iTotal + iTick;

            lblTikPoint.Text = string.Format("{0} (1 : {1}), (3 : {2}), (50 : {3})", iTick.ToString(),i1Level.ToString(),i3Level.ToString(),i50Level.ToString());

            lblTotal.Text = iTotal.ToString();
        }

        private void btnAdd_Click(object sender, EventArgs e) 
        {
            Button obtn = sender as Button; 

            switch (obtn.Name)
            { 
                case "btn1Add":
                    if (iTotal>100)
                    {
                        iTotal = iTotal - 100;
                        i1Level++;
                        i1Add = 1 * i1Level;
                    }                   
                    break;

                case "btn3Add":
                    if (iTotal > 300)
                    {
                        iTotal = iTotal - 300;
                        i3Level++;
                        i3Add = 3 * i3Level;
                    }                    
                    break;

                case "btn50Add":
                    if (iTotal > 5000)
                    {
                        iTotal = iTotal - 5000;
                        i50Level++;
                        i50Add = 50 * i50Level;
                    }                    
                    break;

                default:
                    break;
            }
        }

    }
}

3. 결과물 부분

 


4. C#기초 예시 / 참고 자료를 더 보고 싶다면?

2021.06.27 - [문과 코린이의, [C#] 기록/C# 활용] - [문과 코린이의 IT 기록장] C# 기초 예시 - XMLReader, XMLWriter

2021.06.26 - [문과 코린이의, [C#] 기록/C# 활용] - [문과 코린이의 IT 기록장] C# 기초 예시 - StreamReader, StreamWrite


* 유의사항
- 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다.
- 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다.
- 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :)
반응형