선언

Thread worker;

사용

스레드를 사용하기 전에 작업 스레드가 진행 중에 있으면 중단하고 제거하는 코드를 추가하였다. 

ParameterizedThreadStart()함수를 통해 매게변수를 필요로 하는 함수를 사용할 수 있고 매게변수가 없으면 스레드 생성 매개변수로 그냥 함수명을 주면 된다.

        private void button1_Click(object sender, EventArgs e)
        {
            int textbox_value = int.Parse(textBox1.Text);
            if (textbox_value <= 249 && textbox_value >= 1)
            {
                if (worker != null)
                {
                    if (worker.IsAlive)
                    {
                        //worker.Interrupt();
                        worker.Abort();
                    }
                }
                worker = new Thread(new ParameterizedThreadStart(Run));
                worker.Start(textbox_value);
            }

        }

스레드 함수

작업 스레드를 생성하여 얻을 수 있는 이점은 Thread.Sleep() 함수를 편안하게 사용할 수 있다.

만약 UI 스레드에서 Sleep을 사용하게 되면 모든 동작이 멈추게 될 것이다. 왜냐면 UI 스레드는 메인 스레드 주요한 대부분의 작업이 이루어지고 있는 스레드이기 때문이다. 

작업 스레드에서는 UI에 관련된 값에 직접 접근하면 문제가 발생한다. . UI 스레드와 작업 스레드에서 동시에 UI에 접근하는 상황은 예기치 못한 오류를 발생할 수 있기 때문에 BeginInvoke라는 함수를 사용하여 UI에 접근하도록 한다.  

        public void Run(object idx)
        {
            try
            {
                if (!this.IsHandleCreated)
                {
                    this.CreateHandle();
                }
                int frame_idx = Convert.ToInt32(idx);
                if (now_idx < frame_idx)
                {
                    // 전진
                    for (int i = now_idx; i <= frame_idx; i++)
                    {
                        string str = filename(i);
                        pictureBox1.BeginInvoke(new Action(() => pictureBox1.Load(str)));
                        now_idx = frame_idx;
                        Thread.Sleep(50);
                    }
                }
                else if (now_idx > frame_idx)
                {
                    // 후진
                    for (int i = now_idx; i >= frame_idx; i--)
                    {
                        string str = filename(i);
                        pictureBox1.BeginInvoke(new Action(() => pictureBox1.Load(str)));
                        now_idx = frame_idx;
                        Thread.Sleep(100);
                    }
                }
            }
            catch(Exception e)
            {

            }
        }

 

'C#' 카테고리의 다른 글

.NET Reflection  (0) 2021.03.29
Dbset 직접 바인딩 에러 해결법  (0) 2021.02.25
외부 프로젝트 참조하기  (0) 2021.02.25
[Winform] Dock  (0) 2021.01.22
C# Dictionary  (0) 2020.11.30

+ Recent posts