
[문과 코린이의 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
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |
'문과 코린이의, [C#] 기록 > C# 활용' 카테고리의 다른 글
[문과 코린이의 IT 기록장] C# 활용 - IF문 실습 , 반복문 실습 (0) | 2022.08.04 |
---|---|
[문과 코린이의 IT 기록장] C# 활용 -Windows From 기초 & 학생관리 클래스 모델링 실습 (0) | 2022.08.01 |
[문과 코린이의 IT 기록장] C# 기초 예시 - XMLReader, XMLWriter (0) | 2021.06.27 |
[문과 코린이의 IT 기록장] C# 기초 예시 - StreamReader, StreamWrite (0) | 2021.06.26 |
[문과 코린이의 IT 기록장] C# 기초 예시 - 오버라이딩과 오버로딩 (0) | 2021.06.25 |