Data Drink

Thread 정의와 사용 본문

C# 교육/Thead

Thread 정의와 사용

Data Drink 2020. 9. 23. 19:49

 

이번 시간에는 Thread를 이용해서 미리 생성한 함수를 이용하여 아래와 같은 마우스 위치를 반복 추출하는 방법을 알아보겠습니다.

 

 

 

먼저 Thread를 사용하기 위해선 정의를 정확하게 파악해야겠습니다!

 

<Thread란>

스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다.

일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다.

쉽게 말해서, 스레드는 여러 멀티의 작업환경에서 좀 더 효율적으로 작업을 할 수 있도록 도와준다라고 생각하면 되겠네요!

 

<Thread 선언>

스레드(thread)를 사용하기위해서는 기본적으로 usingSystem.Threading; 을 선언해줘야 사용이 가능합니다!

 

<Thread 상태 변화>

  • ThreadState.Unstarted: Thread.Start() 호출 전
  • ThreadState.Running: Thread.Start()를 호출하여 스레드가 동작중인 상태
  • ThreadState.Suspended: Thread.Suspended()에 의해 스레드가 일시 중단된 상태. Thread.Resume()에 의해 Running 상태로 변화
  • ThreadState.WaitSleepJoin: Thread.Sleep(), Thread.Join(), Moniter.Enter() 메소드에 의해​ 스레드가 블록(Block)된 상태
  • ThreadState.Aborted: Thread.Abort()에 의해 스레드가 취소된 상태
  • ThreadState.Stopped: Thread.Abort()를 호출하거나 ​스레드가 실행 중인 메소드가 종료된 상태
  • Thread.Background: 스레드가 백그라운드에서 동작중인 상태​. 포어그라운드(Foreground) 스레드가 하나라도 살아있는 한 프로세스는 죽지 않지만, 백그라운드(Background) 스레드가 여러 개 살아있어도 프로세스의 생애엔 영향을 미치지 않음.​ Thread.IsBackground 속성에 true를 입력하면 Background 상태가 됨​

참고 출처 : https://ing-yeo.net/2018/05/csharp-basic-thread-task/

 

<전체 소스코드>

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
 
namespace JGJ_Thread_Mouse
{
    public partial class Form1 : Form
    {
        //스레드 생성 MouseThread
        Thread MouseThread; 
        public Form1()
        {
 
            InitializeComponent();
            //위에서 생성한 스레드에 ThreadMouse 함수 사용
            MouseThread = new Thread(ThreadMouse); 
            MouseThread.Start(); 
        }
 
        public void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
        public void ThreadMouse()
        {
            while (true)
            { 
            int x = MousePosition.X;
            int y = MousePosition.Y;
 
            // 생성되어진 스레드가 아니고 다른 스레드에서 호출된경우 true반환 -> 스레드생성
            if (this.InvokeRequired) 
            {
                this.Invoke(new MethodInvoker(delegate ()
                {
                        labelx.Text = x.ToString();
                        labely.Text = y.ToString();
 
                }
                ));          
            }
                // InvokeRequired false 경우 정상 작업진행
                else
                {
                    labelx.Text = x.ToString();
                    labely.Text = y.ToString();
                }
             }
        }
 
        // 스레드 중단 버튼 이벤트
        private void button1_Click(object sender, EventArgs e)
        {
            MouseThread.Abort();
        
        }
 
        // 스레드 재할당 버튼 이벤트
        private void button2_Click(object sender, EventArgs e)
        {
            // 스레드를 중단하게되면 (Abort) 스레드를 재할당해야한다. 
            MouseThread = new Thread(new ThreadStart(ThreadMouse));
            MouseThread.Start();
        }
    }
}
 
 
cs