본문 바로가기
개발 이야기/C# 이야기

C# Thread 시작과 종료

by 런던살자 2019. 7. 3.

안녕하세요 마블랑입니다.

 

지난번 C# 로딩화면인 스플래쉬 화면에 대해 포스팅을 할때 Thread에 대해서 언급한적이 있습니다.

 

그때는 Thread를 시작하는 부분만 잠깐 사용하고 별다른 설명 없이 넘어갔었는데요

 

이번에는 Thread의 시작과 종료에 대해서 알아보고 부수적인 설명을 추가하려고 합니다. ^^

 

 

 

예제 프로그램화면입니다.

 

Thread 시작 버튼을 누르면 아래 카운트가 증가합니다. 그리고 Thread 중지버튼을 누르면 카운트가 중지됩니다.

 

카운트 증가는 Thread에서 반복문으로 처리하고 있습니다. 만약 Thread로 처리하지 않는다면 프로그램은 반복문이 끝날때까지 멈춰있을것입니다.

 

Thread 중지버튼은 Thread를 종료하는 것이기 때문에 종료가 된뒤에 시작버튼을 다시 클릭하면 카운트가 0부터 다시 시작 됩니다. 

 

 

그럼 샘플코드를 살펴보겠습니다.

 

버튼에 대한 이벤트를 참고하여 Thread의 시작과 종료 코드를 보시면 됩니다. 

 

Thread 객체에 생성자로 함수를 넘기는데 이 함수가 Thread에서 실행될 함수입니다.

using System;
using System.Threading;
using System.Windows.Forms;

namespace WindowsForms_Thread
{
    public partial class Form1 : Form
    {
        delegate void Delegate_ShowCnt(string msg);

        Thread thread;
        public Form1()
        {
            InitializeComponent();
        }

        private void Bt_threadStart_Click(object sender, EventArgs e)
        {
            thread = new Thread(Thread1);
            thread.Start();
        }

        private void Bt_threadStop_Click(object sender, EventArgs e)
        {
            thread.Abort();
            thread.Join();
        }

        private void Thread1()
        {
            try
            {
                for (int i = 0; i < 100000; i++)
                {
                    this.Invoke(new Delegate_ShowCnt(showText), i.ToString());
                    Thread.Sleep(500);
                }
            }
            catch { }
        }

        private void showText(string cnt)
        {
            tb_count.Text = cnt;
        }
    }
}

 

지난번에도 이야기했듯이 Thread에서 메인폼의 컨트롤에 접근할때는 에러가 발생합니다. 그렇기 delegate를 선언하고 사용해야합니다.

 

Thread함수 내부의 invoke로 구현되어 있는 부분이 해당되는 부분입니다. 

 

 

현재 샘플코드를 활용하려면 몇가지 사항을 추가해야합니다. (동작하는데 문제는 없지만 에러처리 등 Thread로 인해 발생하는 에러를 막기 위함입니다 ^^)

 

시작버튼을 여러번 눌렀을경우 에러처리를 하지 않았군요.

 

샘플 코드를 보면 Thread 객체를 전역변수로 선언하였습니다.

 

시작과 종료를 버튼으로 처리하기 위해 그렇게 선언하였습니다. 

 

그런데 시작버튼을 여러번 누르면 이전의 Thread가 종료되지 않고 새로 객체를 생성하고 새로운 Thread가 실행되기 때문에 이것에 대한 에러처리를 꼭 해야합니다. flag방식으로 하거나 객체가 이미 있거나를 판단하여 막아야합니다.

 

그렇게 여러개의 Thread를 돌릴 수는 있지만 종료하는것이 까다로워집니다.

 

 

그리고 Thread를 종료하지 않고 프로그램을 종료했을경우에도 Thread가 종료되게 처리해두어야합니다~

 

 

위 두가지 사항을 염두해 두시고 샘플코드를 활용하시기 바랍니다 ^^

 

 

이상 마블랑이었습니다.

 

읽어주셔서 고맙습니다

댓글