안녕하세요. 오늘은 C# 윈폼환경에서 스레드를 사용해보겠습니다.
가장많이 스레드를 쓰는 이유는 메인스레드에서 UI를 변경할경우 렉이 걸리게되는데 그때 스레드를 사용합니다
위의 동영상처럼 버튼을 클릭하면 숫자가 1씩 올라가고 버튼을 클릭하면 숫자가 멈추는 프로그램을 해볼겁니다
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
31
32
33
34
35
36
37
38
39
40
41
42
|
public partial class Form1 : Form
{
Thread th;
int num=0;
bool flag = false;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
th = new Thread(th_func);
th.Start();
}
void th_func()
{
while(true)
{
if(flag)
{
if (label1.InvokeRequired)
{
label1.BeginInvoke(new Action(() => label1.Text = num + "")); ;
Thread.Sleep(1000);
num++;
}
}
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
th.Abort();
}
private void button1_Click(object sender, EventArgs e)
{
flag = !flag;
}
}
|
cs |
숫자가 적혀있는 label의 이름은 text1입니다.
3번째줄에 Thread를 선언했고 Thread를 사용하려면 using System.Threading; 해야합니다
5번째줄에 bool자료형을 사용했고 bool는 false와 true를 넣을 수 있고 !false하면 true이고 !true하면 false입니다
11번째줄은 form이 실행되면 실행되는 함수입니다. 아래의 그림처럼 넣어주세요
13번째줄은 스레드를 만들고 스레드를 시작하면 th_func함수를 호출한다는 의미입니다
14번째줄은 스레드를 시작하는 부분입니다
Form1_Load함수는 무조건 실행되고 스레드를 무조건 만들고 실행합니다
17번째줄은 스레드가 호출하는 함수입니다
19번째줄은 스레드가 함수를 호출하면 바로 꺼지니까 꺼지지않게 무한반복문 돌렸습니다
21번째줄flag는 버튼을 클릭하면 true/false가 되므로 23~27번째줄 코드를 실행/미실행하게 합니다
UI는 메인스레드가 관리하고 우리는 스레드를 새로 만들어서 메인스레드에있는 UI에 접근하려고하는데 이때 그냥 접근하면 안 됩니다. 25번째줄처럼 사용해야하고 23번째줄의 label1.InvokeRequired는 호출한게 다른 스레드에 있다면 true고 아니면 false입니다. 지금의 경우 무조건 true입니다. 25번째줄은 다른곳에있는걸 사용할 수 있게 해주는겁니다.
26번째줄은 1초 딜레이합 니다
33번째줄은 윈폼을 끌 때 실행되는 부분입니다
35번째는 스레드를 강제로 끄는 부분입니다. 스레드를 안 끄고 윈폼을 종료하면 메인스레드만 종료하게되고 우리가 만들었던 스레드는 종료가 안돼서 프로그램이 완전히 종료가 안 됩니다
40번째줄은 버튼을 클릭하면 true / false로 변합니다
'프로그래밍 언어 > C#' 카테고리의 다른 글
C# winform에서 exe파일로 디버깅 쉽게하기 (1) | 2024.10.27 |
---|---|
C# 시리얼통신 데이터 잘려서 읽히는 경우 (2) | 2021.11.27 |
C# 예외처리 try,catch,finally (0) | 2021.11.14 |
C# this키워드 (0) | 2021.10.23 |
C# 생성자 (0) | 2021.10.18 |