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