2010-01-05 4 views
3

Windows C++ 응용 프로그램에서 주 스레드를 일시 중단했다가 다시 시작할 수 있어야합니다. 나는 Windows 용 C++에서 주 스레드 일시 중단 및 재개

handle = GetCurrentThread(); 
SuspendThread(handle); 

을 사용하고 작동 중단하면서 그때는하지 않습니다 재개,

ResumeThread(handle); 

를 다시 시작해야된다. 다른 스레드가 일시 중단되고 아무런 문제없이 재개되었지만 기본 스레드와 다른 점이 있습니다.

C# 및 Java에서 많은 스레드를 처리했지만이 작업은 C++에서 처음 수행 한 것으로 상당히 다른 것으로 나타났습니다.

+2

메인 스레드가 일시 중지했다가 다시 시작하려고합니까? 스레드가 중단되어 ResumeThread 호출을 실행할 수 없을 때 어떻게 스레드가 다시 시작할 수 있습니까? – rerun

+0

아니요, SuspendThread 자체를 호출하지만 나중에 ResumeThread가 다른 스레드에 의해 호출됩니다. 디버그 모드에서는 스레드 창에 일시 중단 수를 표시하고 일시 중단이 호출 될 때 1 씩 올라간다가 다시 시작될 때 1 씩 내려 가지 않습니다. –

+0

ResumeThread()는 음수 값을 반환하고, 그렇다면 GetLastError()가 반환하는 값은 무엇입니까? –

답변

12

당신이 GetCurrentThread에서 얻은 "처리"값을 사용하고보기? 그렇다면 그것은 가짜 값입니다. 실제 스레드 핸들을 얻으려면 DuplicateHandle을 사용하거나 시도하십시오

 
HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, GetCurrentThreadId());

+0

감사합니다. –

2

동일한 결과를 얻는 가장 쉬운 방법은 CreateEvent이며 기본 스레드는 WaitForSingleObject이며 다른 스레드에서 SetEvent으로 깨어납니다.

+0

주 스레드가 일시 중단되거나 대기 중이면 메시지 펌프가 펌핑되지 않습니다. 무엇보다 GUI가 응답하지 않는 것이 가장 분명한 결과입니다. –

+0

주 스레드를 일시 중단하지 않더라도 동일한 결과가 나타 납니까? –

+0

그건 내가 말한 것이 아닌가? :) –

6

GetCurrentThread은 호출 스레드에서만 사용할 수있는 "의사 핸들"을 반환합니다. DuplicateHandle을 사용하면 다른 스레드가 주 스레드를 다시 시작할 때 사용할 수있는 실제 핸들을 만들 수 있습니다.

()는 다른 스레드에서 http://msdn.microsoft.com/en-us/library/ms683182%28VS.85%29.aspx

+2

하나님, 나는 마이크로 소프트를 사랑합니다. –

2

그리고 다음은 이전에 사람들이 제안한 내용을 보여주는 예입니다.

#include <stdio.h> 
#include <tchar.h> 
#include <windows.h> 
#include <process.h> 

HANDLE g_hMainThread; 
void TheThread(void *); 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    g_hMainThread = OpenThread(THREAD_ALL_ACCESS, 
           FALSE, 
           GetCurrentThreadId()); 
    printf("Suspending main thread.\n"); 
    _beginthread(TheThread, 0, NULL); 
    SuspendThread(g_hMainThread); 
    printf("Main thread back in action.\n"); 
    return 0; 
} 

void TheThread(void *) 
{ 
    DWORD dwStatus = ResumeThread(g_hMainThread); 
    DWORD dwErr = GetLastError(); 
    printf("Resumed main thread - Status = 0x%X, GLE = 0x%X.\n", 
      dwStatus, 
      dwErr); 
} 
관련 문제