반응형

* 크로스 스레드

 - 자신의 스레드가 아닌 다른 스레드가 그 컨트롤에 접근했었을 때 발생하는 오류

    

* 해결 방법

 

Form1.cs 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Threading;

namespace CrossThread
{
    public partial class Form1 : Form
    {

        /* 
       스레드의 동작을 제어하는 메서드 
       Abort():강제 종료 
       Interrupt():대기 중인 스레드를 중단 
       Join(): 스레드가 종료될 때까지 호출 스레드를 차단 
       Sleep(int millisecondsTimeout): 지정된 시간(밀리초)동안 스레드를 중지 
       Start(): 스레드 시작 
       Suspend(): 일시 중지 
       Resume(): 일시 중지된 스레드 수행 
       */

        Thread thMain;
        bool bThread = false;

        //스레드 최초 한번 실행...
        bool bThreadStart = false;


        #region 3번째 방법...
        //3번째  방법 델리게이트 선언...
        delegate void TextBoxDelegate(string strText);
        //3번째  방법 델리게이트를 위한 함수 선언...
        private void TextBoxFunc(string strText)
        {
            txtThread.Text = strText;
        }
        #endregion

        public Form1()
        {
            InitializeComponent();

            //1. 첫번째 해결 방법 
            //CheckForIllegalCrossThreadCalls = false ;

            thMain = new Thread(new ThreadStart(Thread_Timer));
            thMain.IsBackground = true;                            //스레드를 백그라운드로 지정...
                                                                   //기본 : 포어그라운드 차이점 => 프로그램 종료시 백그라운드 스레드는 하던일 멈추고 같이 종료...
                                                                   //                                              포어그라운드 스레드는 하던일 다 하고 나면 종료...
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            //스레드 종료...
            if (thMain != null)
            {
                if (bThreadStart)
                {
                    thMain.Abort();    //강제 종료...
                }
                else
                {
                    thMain.Interrupt(); //대기중인 스레드 종료...
                }
                
                thMain = null;
            }
        }

        //버튼 이벤트...
        private void button1_Click(object sender, EventArgs e)
        {
            //최초 한번만 실행...
            if (!bThreadStart)
            {
                bThread = true;
                bThreadStart = true;
                thMain.Start();
            }
            //일시정지...
            else
            {
                bThread = true;
                thMain.Resume ();
            }
            
        }
        private void button2_Click(object sender, EventArgs e)
        {
            if(bThreadStart)
            {
                 bThread = false;
            	 //일시 정지 된 스레드 다시 실행...
            	 thMain.Suspend ();  
            }
        }

        void Thread_Timer()
        {
            while (bThread)
            {

                try
                {
                    //크로스 스레드 오류 내기...
                    //txtThread.Text = "크로스 스레드 예제...";

                    //2번째 방법...
                    /*
                    if (txtThread.InvokeRequired == true)
                    {
                        //다른 스래드이다...
                        this.Invoke(new Action(delegate()
                        {
                            txtThread.Text = "크로스 스레드 예제...";
                        }));
                    }
                    else
                    {
                        //같은 스래드이다...
                        txtThread.Text = "크로스 스레드 예제...";
                    }
                     */

                    //3번째 방법으로 사용 예제
                    this.Invoke(new TextBoxDelegate(TextBoxFunc), "크로스 스레드 예제...");


                }
                catch (Exception ex)
                {
                    MessageBox.Show("오류 : " + ex.Message.ToString());
                }
                

                Thread.Sleep(1000);
            }
        }

    }
}

 

위 소스 예제를 보시는 바와 같이 1,2,3 번째 방법 으로 예제를 만들어 보았습니다.

* 요약

[C#] 델리 게이트 (Delegate) - 1 델리게이트란? , 선언 방법과 간단한 예제

 

[C#] 델리 게이트 (Delegate) - 1 델리게이트란? , 선언 방법과 간단한 예제

*델리 게이트(Delegate) - 대리자 로써 C 언어나 C++ 언어 를 공부한 사람이라면 쉽게 접할 수 있는 함수 포인터와 비슷한 기능을 합니다. 또한 콜백 함수 기능 역할도 수행 *델리 게이트 선언 방법과 간단한 예제..

kdsoft-zeros.tistory.com

[C#] 델리 게이트 (Delegate) - 2 델리게이트 콜백과 사용 그리고 체인

 

[C#] 델리 게이트 (Delegate) - 2 델리게이트 콜백과 사용 그리고 체인

앞서 간략 하게 델리게이트가 무엇이며 선언 방법과 사용은 어떻게 하는지 알아 보았습니다. 하지만 사용 방법에 있어 왜 굳이 델리게이트를 사용하지 그냥 함수를 호출 하면 되지 않을까? 그게 더 효율적이지 싶..

kdsoft-zeros.tistory.com

 

반응형

+ Recent posts