선언
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 |