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() 메소드를 호출하면 되는 구나~~
하고 알고 계시면 되겠습니다.
'PP > TIP' 카테고리의 다른 글
제네릭 처리기를 이용하여 자동가입방지 폼 구현 (0) | 2012.01.07 |
---|---|
C# 인터넷 연결 체크하기 (0) | 2012.01.07 |
자동 업데이트 (0) | 2012.01.07 |
HttpContext, HttpWebRequest, HttpWebResponse, Application 등의 경로 (0) | 2012.01.07 |
String <-> byte[] 변환 (0) | 2012.01.06 |