일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- SQL
- Java
- string
- dataframe
- Apache
- google apps script
- PostgreSQL
- PANDAS
- Redshift
- django
- hive
- Github
- math
- gas
- Excel
- Tkinter
- list
- matplotlib
- Google Spreadsheet
- GIT
- c#
- Kotlin
- Python
- Mac
- Google Excel
- numpy
- PySpark
- 파이썬
- array
- Today
- Total
달나라 노트
C# : Timer (타이머 class) 본문
Timer class는 지정한 시간 간격(interval)마다 Tick 이벤트를 발생시키는 class입니다.
위 말이 좀 복잡할수도 있는데 좀 더 와닿게 말하면
Timer는 특정 시간 간격마다 이벤트를 발생시키기 때문에 그 이벤트에 제가 원하는 method를 넣어두면 일정 간격마다 원하는 행동을 하도록 만들 수 있다는 것이죠.
이를 이용하면 일정 시간 간격마다 표시되는 글자를 바꾼다던지, 0.1초마다 공의 위치를 바꿔서 표시되게 하여 공이 마치 움직이는 것처럼 표시한다던지 등의 내용이 가능합니다.
아래 코드는 Timer class를 이용한 코드입니다. 한번 실행시켜봅시다.
using System;
using System.Windows.Forms;
class MyProgram
{
public static void Main()
{
// Constants
int btn_width = 100;
int btn_height = 30;
double show_number = 0;
// Constants
Form fm = new Form();
fm.Width = 500;
fm.Height = 300;
Label lbl = new Label();
lbl.Parent = fm;
lbl.Width = 300;
lbl.Height = 30;
lbl.Text = show_number.ToString();
Button btn_start = new Button();
btn_start.Parent = fm;
btn_start.Text = "Start";
btn_start.Width = btn_width;
btn_start.Height = btn_height;
btn_start.Top = lbl.Bottom;
Button btn_stop = new Button();
btn_stop.Parent = fm;
btn_stop.Text = "Stop";
btn_stop.Width = btn_width;
btn_stop.Height = btn_height;
btn_stop.Top = lbl.Bottom;
btn_stop.Left = btn_start.Right;
Timer timer = new Timer();
timer.Interval = 100;
// Event
void fm_event_start(object sender, EventArgs e)
{
timer.Start();
}
btn_start.Click += new EventHandler(fm_event_start);
void fm_event_stop(object sender, EventArgs e)
{
timer.Stop();
}
btn_stop.Click += new EventHandler(fm_event_stop);
void fm_event_timer(object sender, EventArgs e)
{
show_number = show_number + 1;
lbl.Text = show_number.ToString();
}
timer.Tick += new EventHandler(fm_event_timer);
Application.Run(fm);
}
}
위 코드를 실행할 때 나오는 Window입니다.
Start 버튼을 누르면 숫자가 점점 증가하는 것을 볼 수 있습니다.
반대로 Stop을 누르면 숫자가 증가하는 것이 멈춥니다.
타이머 부분을 봅시다.
Timer timer = new Timer();
timer.Interval = 100;
일단 Timer class를 이용해서 timer 객체를 생성합니다.
Timer class에서 Interval 속성은 Tick 이벤트를 발생시킬 시간 간격을 설정합니다. 단위는 ms(Millisecond)입니다.
따라서 위 코드는 100ms(= 0.1초)마다 Tick이벤트를 발생시킨다는 것입니다.
void fm_event_start(object sender, EventArgs e)
{
timer.Start();
}
btn_start.Click += new EventHandler(fm_event_start);
void fm_event_stop(object sender, EventArgs e)
{
timer.Stop();
}
btn_stop.Click += new EventHandler(fm_event_stop);
Timer class의 Start method는 Timer에서 설정한 Interval 마다 Tick 이벤트를 발생시키는 것을 실행합니다.
반대로 Stop method는 Timer가 Tick 이벤트를 발생시키는 것을 중단합니다.
그래서 Start Button이 클릭되었을 때 timer.Start() method를 실행시켜 타이머를 실행시키고,
Stop Button이 클릭되었을 때에는 timer.Stop() method를 실행시켜 타이머를 중단하도록 합니다.
void fm_event_timer(object sender, EventArgs e)
{
show_number = show_number + 1;
lbl.Text = show_number.ToString();
}
timer.Tick += new EventHandler(fm_event_timer);
위 부분은 timer.Tick 이벤트에 event method를 등록하는 부분입니다.
Timer가 시작되면 일정한 시간 간격으로 Tick 이벤트가 발생합니다.
이 코드에서는 interval을 0.1초로 설정했기 때문에 위 Tick 이벤트는 0.1초마다 한번씩 발생합니다.
fm_event_timer method의 내용을 보면 show_number에 1을 더하고 이것을 lbl.Text로 설정하는 것을 볼 수 있습니다.
fm_event_timer method가 Timer의 Tick event에 등록되어있기 때문에 0.1초마다 이 method가 실행될 것입니다.
즉, 0.1초마다 숫자가 1씩 증가해서 Label에 나타난다는 의미이죠.
그래서 우리가 Start를 누르면 0.1초마다 숫자가 1씩 증가해서 표시되는 것입니다.
저희가 타이머를 다루다보면 현재 타이머가 실행중인지 정지한 상태인지 체크해야 할 필요가 있습니다.
예를들어 현재 타이머가 실행중이라면 버튼을 클릭했을 때 타이머를 중지시키고
반대로 현재 타이머가 실행중이 아니라면 똑같은 버튼을 클릭했을 때 타이머를 실행시키는 기능을 만드는 것이죠.
이러한 기능을 위해서는 현재 타이머가 start 상태인지 end 상태인지를 알려주는 무언가가 필요합니다.
이것은 Timer.Enabled attribute를 사용하면 됩니다.
using System;
using System.Windows.Forms;
class MyProgram
{
public static void Main()
{
// Constants
int btn_width = 100;
int btn_height = 30;
double show_number = 0;
// Constants
Form fm = new Form();
fm.Width = 500;
fm.Height = 300;
Label lbl = new Label();
lbl.Parent = fm;
lbl.Width = 300;
lbl.Height = 30;
lbl.Text = show_number.ToString();
Label lbl_timer_status = new Label();
lbl_timer_status.Parent = fm;
lbl_timer_status.Width = 300;
lbl_timer_status.Height = 30;
lbl_timer_status.Text = "";
lbl_timer_status.Left = lbl.Right;
Button btn_start = new Button();
btn_start.Parent = fm;
btn_start.Text = "Start";
btn_start.Width = btn_width;
btn_start.Height = btn_height;
btn_start.Top = lbl.Bottom;
Button btn_stop = new Button();
btn_stop.Parent = fm;
btn_stop.Text = "Stop";
btn_stop.Width = btn_width;
btn_stop.Height = btn_height;
btn_stop.Top = lbl.Bottom;
btn_stop.Left = btn_start.Right;
Timer timer = new Timer();
timer.Interval = 100;
// Event
void fm_event_start(object sender, EventArgs e)
{
timer.Start();
lbl_timer_status.Text = timer.Enabled.ToString();
}
btn_start.Click += new EventHandler(fm_event_start);
void fm_event_stop(object sender, EventArgs e)
{
timer.Stop();
lbl_timer_status.Text = timer.Enabled.ToString();
}
btn_stop.Click += new EventHandler(fm_event_stop);
void fm_event_timer(object sender, EventArgs e)
{
show_number = show_number + 1;
lbl.Text = show_number.ToString();
}
timer.Tick += new EventHandler(fm_event_timer);
Application.Run(fm);
}
}
위에서 봤던 것과 동일한 예시이지만 버튼을 클릭할 때 Start, End가 실행된 후 Label에 현재 실행 여부(timer.Enabled)를 나타내도록 했습니다.
코드를 실행해봅시다.
Start 버튼을 누르면 타이머가 시작되며 True라고 표시됩니다.
이렇게 타이머가 Start 상태라면 Timer.Enabled 값이 True가 됩니다.
Stop 버튼을 누르면 타이머가 정지되며 False라고 표시됩니다.
이렇게 타이머가 Stop 상태라면 Timer.Enabled 값이 False가 됩니다.
'C# > C#' 카테고리의 다른 글
C# : SystemSounds Beep, Hand (시스템 경고음) (0) | 2022.04.20 |
---|---|
C# : VisualStudio 참조 추가하기 (0) | 2022.04.20 |
C# : Form ClientSize (Window 사용가능한 영역 크기) (0) | 2022.04.20 |
C# : Math.Exp (자연상수의 거듭제곱) (0) | 2022.04.18 |
C# : Math.Truncate (소수점 삭제) (0) | 2022.04.18 |