2016년 7월 14일 목요일

C# winform (윈폼)에서 크로스 스레드 관리. Invoke 사용법


1. 크로스 스레드가 나는걸 생각한다. (ex. 윈폼의 컨트롤들. 얘네는 윈폼 생성시 어떤 스레드가 다 처리한다. 이 스레드를 스레드1 이라고 한다.)

2. 크로스 스레드가 나는 애들. 즉 윈폼의 컨트롤에 접근해서 이용 할려고 할때, 이 일은 스레드1 에게 다 시켜야 한다.

3. 그 외의 것은 스레드 2,3,.. 이 처리해도 된다.


4. 밑의 코드를 보자.

a.버튼 클릭 -> 스레드tr이 Thread_Test1을 실행한다.
b.Thread_Test1을 실행시켜 나가는데 도중에 프로그래스바컨트롤에 접근을 해야되서, 이부분을 스레드1이 처리하게 명령한다. (invoke)
c. progressBar1.Invoke(pro1,new object[] { i}); 이부분이 스레드1이 pro1을 처리하라고 하는부분.
d. pro1은 델리게이트로 progvarCall pro1 = new progvarCall(Thread_Test2);에서 Thread_Test2 가 pro1이다.
e. invoke 는 입력파라미터가 델리게이트 이므로 이렇게 쓴것이다.
f. 그러면 Thread_Test1에서 인보크 부분만 스레드1이 처리하고 나머지는 tr스레드가 처리한다.

즉, tr스레드는 다른거 하고있다가, tr스레드가 호출(인보크) 할때만 Thread_Test2를 실행하고, 끝나면 다시 다른거 하러간다.


public partial class Form1 : Form
{

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

private void button1_Click(object sender, EventArgs e)
{
progressBar1.Minimum = 0;
progressBar1.Maximum = 1000000; //프로그래스의 최대값을 설정
tr = new Thread(Thread_Test1);
tr.Start();
}

delegate void progvarCall(int value);



public void Thread_Test1()
{
progvarCall pro1 = new progvarCall(Thread_Test2);

try
{
for (int i = 0; i < 1000000; i++) // for문을 이용해 프로그래스바의 값을 변경해 줍니다
{
//progressBar1.Invoke(new progvarCall(Thread_Test2),new object[] { i});
progressBar1.Invoke(pro1,new object[] { i}); // 크로스 쓰레드 발생부분만 따로 뺴준다.
//progressBar1.Invoke(pro1); < Invoke 형식 자체가 Invoke(Delegate method, params object[] args) 이다.
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
// 두번째 스레드
public void Thread_Test2(int var)
{
progressBar1.Value = var;
}


}

댓글 없음:

댓글 쓰기