ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쓰레드 제어, 쓰레드 종료
    쓰레드/쓰레드 2022. 4. 3. 13:05

    스레드 제어

     

    아래의 함수를 사용하면 스레드를 잠시 동작을 중지시킬 수도 있고 다시 실행시킬 수도 있다.

     

          DWORD SuspendThread(HWND hThread);

         DWORD ResumeThread(HWND hThread);

     

    SuspendThread는 스레드의 동작을 중지시키고 ResumeThread는 중지된 스레드를 다시 동작하도록 재개한다.

     

    스레드는 내부적으로 중지 카운트를 유지하는데 이 카운트는 SuspendThread 함수가 호출되면 증가하고,

    ResumeThread 함수가 호출되면 감소하며 카운트가 0이 되면 스레드는 재개된다.

    그래서 SuspendThread를 두 번 호출했다면 ResumeThread도 같이 두 번 호출해 주어야 스레드가 재개된다.

     

    스레드를 만들고 실행 중에 스레드를 중지/재개 할 수 있는 예제)

     

     

    WM_LBUTTONDOWN : 새로운 스레드를 만들어서 작업을 시키고 주스레드는 최대한 빨리
                                   메세지 루프로 돌아 가서 다음 메세지를 처리한다.

     

    ResumeThread(hThread)  스레드 재개
    SuspendThread(hThread)  스레드 일시 중지

     

     

     

    마우스 클릭을 하면 프로그레스 바가 멈췄다 갔다 하는 것 을 볼 수있다.

    ResumeThread(hThread)  SuspendThread(hThread)  

    함수로 우리는 쓰레드를 제어 할수 있다.

     


    스레드 종료

     

    일반적으로 스레드는 일정한 백그라운드 작업을 맡아 처리하고 작업이 완료되면 종료되는 것이 보통

     

    예를 들어 시간이 오래 걸리는 인쇄 작업이나 정렬, 다운로드 작업 등에 스레드가 사용된다.

    작업이 종료되면 스레드의 시작함수가 종료되며 이렇게 되면 스레드도 더 이상 필요가 없으므로 파괴된다.

     

    작업 스레드가 백그라운드 작업을 할 때 주 스레드는 작업 스레드를 만들기만 하고 종료 상태에는 별로 관심을 두지 않는 것이 보통이다. 특별한 경우를 제외하고 두 스레드는 서로 독립적으로 실행될 뿐이다.

    그러나 주 스레드는 적어도 작업 스레드가 종료되었는지의 여부는 주기적으로 조사를 해야한다.

     

       BOOL GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode);

     

    첫 번째 인자 :  스레드의 핸들을 넘겨주면

    두 번째 인자 :  스레드의 종료 코드를 조사

     

    이 함수로 주 스레드는 작업 스레드의 종료 상태를 조사하여 다음 행동을 결정할 수 있다.


     

    때로는 작업 중간에 스레드를 종료해야 할 경우도 있다.

     

    예를 들어 다운로드를 받는 스레드를 만들었는데 중간에 사용자가 다운로드를 취소했다면

     이상 이 스레드는 존재할 필요가 없다.

     

     

    스레드를 강제 종료할 때사용하는 함수

     

       void ExitThread(DWORD dwExitCode);

     

       void TerminateThread(HANDLE hThread, DWORD dwExitCode);

     

    ExitThread() :  스레드가 스스로를 종료할 때 사용하는 인수로 종료 코드를 넘겨준다
    스레드가 ExitThread를 호출하면 자신의 스택을 해제하고 연결된 DLL을 모두 분리한 후 스스로 파괴된다. 

     

    TerminateThread() :  스레드 핸들을 인수로 전달받아 해당 스레드를 강제로 종료한다.

                               주 스레드가 작업 스레드를 강제로 종료하고자 할 때 이 함수가 사용된다. 

     

    TerminateThread() 주의점
    이 함수는 스레드와 연결된 DLL에게 어떠한 통보도 하지 않으므로 DLL 들이 제대로 종료 처리를 하지 못할 수도 있으며 할당된 자원들이 제대로 해제되지 않을 수도 있다. 

    이 함수 외에는 다른 방법이 없을 때 등의 위급한 상황에서만 사용되어야 하며 스레드가 어떤 작업을 하고 있는지, 종료 후 어떤 일이 벌어질지를 정확히 알고 있을 때만 사용해야 한다. 

    스레드를 중간에 종료할 때는 전역변수나 기타 다른 방법을 통해 스레드가 종료 사실을 알 수 있도록 해 주어 ExitThread로 스스로 종료하도록 하는 것이 가장 좋다. 

    댓글

Designed by Tistory.