다음 예제에서 TerminateThread()는 리소스를 누설하고 응용 프로그램을 확정되지 않은 상태로 둘 수 있는 다른 스레드를 강제로 종료하는 데 사용됩니다. 소멸자 std::thread::~thread()는 스레드가 여전히 조인가능한 경우에만 스레드를 종료할 수 있습니다. C++ 스레드는 시작 된 후 조인 또는 분리를 호출하기 전에 조인 할 수 있습니다 (이 예제 참조). 따라서 조인/분리된 스레드의 경우 std::thread 소멸자는 스레드를 전혀 종료할 수 없습니다. TerminateThread는 가장 극단적인 경우에만 사용해야 하는 위험한 기능입니다. 대상 스레드가 수행하는 작업을 정확히 알고 있고 종료 시 대상 스레드가 실행될 수 있는 모든 코드를 제어하는 경우에만 TerminateThread를 호출해야 합니다. 예를 들어 TerminateThread는 다음과 같은 문제가 발생할 수 있습니다: 호환 되는 솔루션 작업을 수행 하는 동안 스레드 무기한 절전 될 수 있습니다 때 처리 하기 어려워, 따라서 반환 되지 않습니다. 일반적인 예로는 네트워크 데이터를 기다리는 스레드가 있지만 더 많은 스레드가 있습니다. MFC UI 컨트롤은 스레드 안전이 아닙니다. 즉, 작업자 스레드 내에서 컨트롤을 조작해서는 안 됩니다. 예를 들어 작업자 스레드 내부에서 m_ctrlProgress.StepIt()를 호출할 수 없습니다. 실제로 이러한 간단한 함수에서 `벗어날 수 있습니다`하지만 더 복잡한 MFC UI 메서드는 신뢰할 수없는 결과를 제공합니다. 여기서 스레드 proc는 CProgressMgr 클래스의 정적 메서드가 될 것이며 CProgressMgr 소멸자가 대화 상자가 소멸될 때 호출되기 때문에 스레드를 종료해야 하는 경우에도 정리가 수행됩니다.

또한 닫는 데 1 초 이상 걸리지 않으므로 스레드를 종료하지 않습니다. 프로덕션 코드 예제를 더 많이 제공하기 위해 이 방법을 코딩했습니다. 이 예제의 스레드 절차는 간단합니다. 작업자 스레드에서 일부 작업을 수행하고 UI의 진행 률을 업데이트하는 시뮬레이션만 하면 됩니다(내부적으로 PostMessage()를 사용하여 UI에 메시지를 보내는 NotifyUI 메서드를 통해 UI의 진행 률을 업데이트합니다. 그러나 간단하더라도 몇 가지 좋은 기술이 있습니다 : 응용 프로그램의 UI는 세 개의 단추와 진행률 제어로 구성된 간단한 대화 상자가 될 것입니다. UI를 만들려면 리소스 편집기를 열고 IDD_STARTSTOP_DIALOG를 클릭합니다. 다음으로 확인 단추를 삭제하고 첫 번째 단추 ID_STARTPAUSERESUME의 ID와 ID_STOP으로 두 번째 단추를 추가합니다. 또한 진행률 컨트롤을 추가합니다. 그림 1과 같은 것으로 끝나야 합니다. TODO (특히 C ++ 코드에서 ExitThread()를 사용하는 것에 대해 하나여야 합니다.

실행 중인 스레드를 표시 하기 위해 함수 show_thread() 스레드를 시작할/중지할 때마다 호출 됩니다. 다음으로` 일반 C++ 클래스 마법사가 나타납니다. 클래스 이름 아래에서 `CProgressMgr`을 입력하고 `인라인` 확인란을 선택합니다(그림 5 참조). 인라인 옵션은 .cpp 파일이 없는 .h 파일만 만듭니다. `완료` 버튼을 누릅니다. 진행률 `관리자` 코드는 간단하기 때문에 전체 클래스 선언 및 구현을 .h 파일에 넣을 수 있습니다.`인라인` 확인란 옵션은 이 작업을 수행합니다.