2013-01-24 2 views
3

내가 혼란스럽고 궁금한 점이 있다면, 별도의 게시물에서 "새 스레드는 명시 적으로 만들 때 작성됩니다 .C++ 프로그램은 기본적으로 단일 스레드입니다." ollydbg에 새 스레드를 명시 적으로 생성하지 않는 프로그램을 열면 여러 스레드가 실행되는 경우가 2 회 발생하는 것으로 나타났습니다. 나는 메시지 루프가 실행을 멈추지 않고 어떻게 작동 하는지를 이해하기를 원했고, 설명은 그것이 어떻게 작동 하는지를 설명하는데 매우 부족했다.메시지 루프는 스레드를 어떻게 사용합니까?

메시지 루프가 새 스레드를 만들거나 주 스레드를 차지합니까? 메인 쓰레드가 필요하다면 코드 순서와 상관없이 다른 모든 것이 실행 된 후에 그렇게 할 수 있습니까? 이 작업을 수행하지 않지만 여전히 주 스레드를 사용하는 경우 새 스레드가 생성되므로 프로그램이 메시지 루프에 걸리지 않고 실행할 수 있습니다.

편집 : 실험을 통해 대부분의 내 질문을 해결했습니다. 메시지 루프는 코드 뒤에 메인 쓰레드와 코드를 차지 : 뭔가 특별한 프로그램이 메시지 루프에 갇혀 있기 때문에 그것을 실행하도록하기위한 것입니다하지 않는

while (GetMessage (&messages, NULL, 0, 0)) 
{ 
    TranslateMessage(&messages); 
    DispatchMessage(&messages); 
} 
return messages.wParam; 

이 실행되지 않습니다. 실행 된 창 프로 시저에 무한 루프를 넣으면 프로그램이 중단됩니다. 그래도 내가 선호하는 정도로 olly에서 여러 스레드의 신비를 이해하지 못한다.

+0

귀하는 귀하의 프로그램이하는 것을 요구하고 있습니다. 어떻게 알 수 있니? –

+0

예, 스레드는 명시 적으로 만들어야하지만 다른 라이브러리/함수는 필요에 따라 만들 수 있습니다. 디버거에 연결하고 중단 할 경우 적어도 하나 이상의 다른 스레드가 표시됩니다. 걱정할 필요는 없지만 시작 주소/호출 스택에서 무엇인지 확인할 수 있어야합니다. – Deanna

답변

8

아마도 "메시지 루프"가 일이 아니라는 것을 깨닫는 것일 수도 있습니다.과 같이 입력하십시오. 그것은 정말로 스레드가하는 것입니다.

윈도우의 스레드는 일반적으로 UI를 소유하는 스레드와 배경 작업을 수행하는 스레드 (네트워크 작업) 중 하나에 속합니다.

간단한 UI 응용 프로그램은 일반적으로 UI 스레드 인 스레드가 하나뿐입니다. UI가 작동하려면 스레드가 처리 할 입력 (마우스 클릭, 키보드 입력 등)이있을 때까지 기다려야하고 입력을 처리해야합니다 (예 : 상태를 업데이트하고 창을 다시 그립니다). 그런 다음 더 기다리십시오 입력. 이 "입력을 기다리고 처리하고 반복하십시오."은 메시지 루프 인입니다. (이 단계에서 언급 할만한 가치가있는 것은 메시지 대기열이다. 각 쓰레드는 쓰레드에 대한 입력 메시지를 저장하는 자체 입력 큐를 가지고 있고, "입력 대기 중"쓰레드는 큐에 무엇이 있는지를 검사한다. , 그렇지 않다면 기다릴 때까지 기다린다.) win32에서는 thread가이 방법으로 입력을 적극적으로 처리하고있을 때 "메시지를 펌핑"한다고한다.

일반적인 간단한 Windows 응용 프로그램의 기본 코드는 먼저 기본 초기화를 수행하고 기본 창을 만든 다음 입력 및 처리 대기 메시지 루프를 수행합니다. 이 작업은 일반적으로 사용자가 메인 윈도우를 닫을 때까지 스레드가 루프를 빠져 나올 때까지 수행되며 이후에 오는 코드를 계속 수행합니다. 일반적으로 클린업 코드입니다.

Windows 응용 프로그램의 공통 아키텍처는 기본 UI 스레드 (대개 기본 스레드)를 만들고 모든 UI를 만들고 소유하며 모든 UI에 대한 메시지를 디스패치하는 메시지 루프가 있습니다. 만들어진. 응용 프로그램이 소켓에서 읽는 것과 같이 잠재적으로 차단할 수있는 작업을 수행해야하는 경우 작업자 스레드가 종종이 용도로 사용됩니다. UI 스레드를 차단하지 않으려면 (예 :소켓에서 입력을 기다리는 동안), 그 시간 동안 입력을 처리하지 않으므로 UI가 응답하지 않게됩니다.

하나 이상의 UI 스레드가있는 응용 프로그램을 작성할 수 있습니다. 창을 만드는 각 스레드는 자체 메시지 루프가 필요합니다. 그러나 이것은 상당히 고급 기술이며 대부분의 기본 응용 프로그램에 유용하지는 않습니다.

보고있는 다른 스레드는 백그라운드 작업을 수행하기 위해 Windows에서 만든 일종의 도우미 스레드입니다. 대부분은 무시할 수 있습니다. 예를 들어, COM을 초기화하면 Windows가 일부 COM 내부 항목을 관리하기 위해 작업자 스레드를 작성하게되고 일부 보이지 않는 HWND도 생성 될 수 있습니다.

2

일반적으로 프로그램을 시작하는 스레드는 메시지 루프 만 실행하여 주 스레드를 사용합니다. 메시지 처리 또는 UI 업데이트에 포함되지 않는 것은 일반적으로 다른 스레드에 의해 수행됩니다. 응용 프로그램이 스레드를 작성하지 않더라도 추가 스레드는 라이브러리 나 운영 체제에서 작성할 수 있습니다. Windows는 프로세스 내에서 스레드를 만들어 메시지 루프에 이벤트를 전달하는 것과 같은 작업을 처리합니다.

+0

그래서 메인 쓰레드가 메시지 루프에 도착하면 메시지 루프를 연속적으로 실행하고 프로그램 메인 함수에 남아있는 것을 실행하기 위해 별도의 쓰레드를 생성합니다. 나는 아직도 꽤 혼란 스럽다. – user1958850

+0

@ user1958850 : 이것은 하나의 공통 패턴입니다. UI 스레드는 IO를 실행합니다. UI가 응답 할 수 있도록 다른 모든 스레드에 의해 수행됩니다. –