posted by 방랑군 2012. 1. 6. 17:51

1.  // 소켓에 관련된 스레드가 돌고 있으므로 application 스레드와의 충돌을 피하기 위해 델리게이트를 이용 

        // 어플리케이션의 스레드에 포함되기 위해 델리게이트 이용
        public void LogWrite(string msg)
        { 
            // 소켓에 관련된 스레드가 돌고 있으므로 application 스레드와의 충돌을 피하기 위해 델리게이트를 이용합니다.
            LogWriteDelegate deleLogWirte = new LogWriteDelegate(AppendLog);
            // 생성한 델리케이트를 이용하여 invoke를 실행합니다.
            this.Invoke(deleLogWirte, new object[] { msg });
        }

        // 로그를 찍고 스크롤된 위치에 위치하도록 합니다.
        public void AppendLog(string msg)
        {
            try
            {
                txtOutput.AppendText(msg + "\r\n");
                txtOutput.Focus();
                txtOutput.ScrollToCaret();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        } 

2.
private void Form1_Load(object sender, EventArgs e)
{
            Thread t1 = new Thread(new ThreadStart(Listen));
            t1.Start();
} 

public void Listen()
{
            adtx ad = new adtx(textBox1.AppendText);
           
            IPAddress addr = new IPAddress(0);
            TcpListener server = new TcpListener(addr, 5425);
            server.Start();


            Invoke(ad, "서버시작");

            ...

}

 

Listen() 메소드는 별도의 작업자 쓰레드가 실행하는 메소드입니다.

 

즉, Listen() 메소드는 메인 쓰레드가 아닌 다른 쓰레드에서 실행됩니다.

 

그러므로,

 

Listen() 메소드의 코드는 별도의 작업자 쓰레드 상에서 실행되며,

 

메인 쓰레드에서 생성된 컨트롤에는 접근할 수 없습니다.

 

그렇지만,

 

           Invoke(ad, "서버시작");

메소드 호출을 통해, 간접적으로 메인 쓰레드의 컨트롤에 접근할 수 있습니다.

 

위의 문장은

 

           this.Invoke(ad, "서버시작");

다음과 같습니다.

 

여기서, this 참조는 Form 개체를 가리키는 것이지요.

 

별도의 쓰레드에서 메인 쓰레드의 컨트롤에 접근하려면,

 

Form 개체의 Invoke() 메소드를 호출하면 되는 구나~~

 

하고 알고 계시면 되겠습니다.