프로그래밍 언어/C#

C# 스레드 사용하기

원원 2022. 4. 25. 22:24

안녕하세요.  오늘은 C# 윈폼환경에서 스레드를 사용해보겠습니다.

가장많이 스레드를 쓰는 이유는 메인스레드에서 UI를 변경할경우 렉이 걸리게되는데 그때 스레드를 사용합니다

 

0

위의 동영상처럼 버튼을 클릭하면 숫자가 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# 시리얼통신 데이터 잘려서 읽히는 경우  (2) 2021.11.27
C# 예외처리 try,catch,finally  (0) 2021.11.14
C# this키워드  (0) 2021.10.23
C# 생성자  (0) 2021.10.18
C# Format 메소드 사용하기  (0) 2021.10.02