위의 ComputeThreadProc() 함수에서 첫 번째 WaitForSingleObject() 호출은 스레드 차단의 예입니다. 스레드는 이벤트가 신호가 표시될 때까지 실행을 중지합니다. 스레드는 다른 여러 방법으로 차단될 수 있습니다. 예를 들어 Win32 Sleep() 함수를 호출하여 스레드를 500밀리초 동안 “절전”에 넣을 수 있습니다. 많은 함수는 스레드, 특히 하드웨어 장치 또는 인터넷 호스트에 액세스하는 기능을 차단합니다. 다시 Win16 일, 그들은 완료 될 때까지 그 기능은 CPU를 인수. Win32에서는 다른 프로세스와 스레드를 실행할 수 있습니다. 기본 사용자 인터페이스 스레드에 차단 호출을 넣지 않아야 합니다. 주 스레드가 차단되면 메시지를 처리할 수 없으며 프로그램이 느려지는 것처럼 보입니다. 무거운 파일 I/O가 필요한 작업이 있는 경우 코드를 작업자 스레드에 넣고 주 스레드와 동기화합니다. 프로세스는 자체 메모리, 파일 핸들 및 기타 시스템 리소스를 소유하는 실행 중인 프로그램입니다. 개별 프로세스에는 스레드라는 별도의 실행 경로가 포함될 수 있습니다.

그러나 여러 스레드에서 단일 함수를 호출할 수 있으므로 별도의 스레드에 대해 별도의 코드를 찾아볼 수 없습니다. 대부분의 경우 프로세스의 모든 코드 및 데이터 공간은 프로세스의 모든 스레드에서 사용할 수 있습니다. 예를 들어 두 스레드는 동일한 전역 변수에 액세스할 수 있습니다. 스레드는 운영 체제에서 관리하며 각 스레드에는 고유한 스택이 있습니다. 동시에 별도의 작업을 실행하여 성능이 향상될 수 있는 경우 응용 프로그램에서 여러 스레드를 사용할 수 있습니다. 예를 들어 5분마다 현재 문서를 자동으로 백업하는 워드 프로세싱 응용 프로그램을 고려해 보십시오. 주 응용 프로그램 창을 통해 문서에 대한 사용자의 입력은 기본 스레드에서 처리됩니다. 응용 프로그램 코드는 자동 백업을 예약하고 수행하는 별도의 보조 스레드를 만들 수 있습니다. 보조 스레드를 만들면 긴 문서를 백업하여 응용 프로그램의 사용자 인터페이스의 응답성을 방해할 수 없습니다. 내 대화 상자에서 (나는 아마이것을하지 않을 것이다; GetDlgItem 피하기에 대한 내 에세이를 참조하지만, 여기에 요점을 설명하고 싶습니다 이것은 내가 생각해 낼 수있는 가장 간단한 예입니다). 내 응용 프로그램에 이 것을 나타내는 기존 CWnd 파생 개체가 없습니다. 어떻게 됩니까? 아래 표에 필요한 변환이 표시되지 않으면 변환 조합을 사용해야 합니다.

예를 들어 핸들을 fstream으로 변환하려면 아래의 OnStart() 처리기가 대화 상자의 시작 단추에 매핑되는 것과 같은 작업을 수행해야 합니다. 그 작업은 타이머와 작업자 스레드를 시작하는 것입니다. 예를 들어, THREAD_PRIORITY_LOWEST로 우선 순위를 설정하면 AfxBeginThread()의 세 번째 매개변수를 변경하여 작업자 스레드의 우선 순위를 변경할 수 있습니다. 아래와 같이 OnStart()를 변경합니다. 상속에 대해 보장할 수 있는 한 가지는 핸들이 프로세스와 상속 프로세스 모두에서 동일한 숫자 값을 갖습니다. m_pfnThreadProc이 컨트롤러 함수를 가리키는 경우 코드는 작업자 스레드를 처리하고 있음을 알고 있습니다. 컨트롤러 함수가 호출되고 스레드가 종료됩니다. m_pfnThreadProc이 NULL이면 함수는 사용자 인터페이스 스레드를 다루고 있다고 가정합니다. 스레드 개체의 InitInstance() 함수는 스레드 초기화를 수행하도록 호출되어 주 창 및 기타 사용자 인터페이스 개체를 만듭니다. InitInstance()가 TRUE를 반환하여 성공적으로 반환하는 경우 Run() 함수가 호출됩니다.