MFC 스레드 존재 여부 판단

4283 단어
MFC 스레드 존재 여부 판단
GetExitCodeThread 함수는 스레드를 가져오는 종료 코드입니다.
함수: GetExitCodeThread()
기능: 끝 라인의 반환값 가져오기
함수 원형: BOOL GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode);
매개 변수:hThread는 반환 값을 가져오려는 스레드 객체에 대한 핸들을 가리킵니다.
스레드를 저장하는 데 사용되는 lpExitCode 반환값
반환 값: 함수 실행이 성공하면 0이 아닌 값을 반환하고 그렇지 않으면 0(FALSE)을 반환합니다.
첫 번째 파라미터는 루틴 핸들입니다.CreateThread로 루틴을 만들 때 얻을 수 있습니다.
두 번째 파라미터는 DWORD의 지침이다. 사용자는 DWORD 형식의 변수를 사용하여 데이터를 수신해야 한다. 되돌아오는 데이터는 라인의 종료 코드이다. 라인 종료 코드를 통해 라인이 실행 중인지 종료 중인지 판단할 수 있다.또는 라인이 정상적으로 퇴출되었는지 이상 퇴출되었는지 판단할 수 있다.
실행에 성공했을 때 스레드의 상태 코드를 저장합니다. 스레드의 반환값이면 스레드가 실행되었음을 의미하고, 스레드가 실행되지 않았을 경우 STILL로 돌아갑니다.ACTIVE, 스레드의 반환 값이 STILL인 경우ACTIVE, 판단할 수 없습니다.
MSDN 설명:
GetExitCodeThread Function
Retrieves the termination status of the specified thread.
 
BOOL WINAPI GetExitCodeThread(   __in           HANDLE hThread,    __out         LPDWORD lpExitCode ); 

Parameters
hThread
A handle to the thread.
The handle must have the THREAD_QUERY_INFORMATION access right. For more information, see Thread Security and Access Rights.
lpExitCode
A pointer to a variable to receive the thread termination status. If the specified thread has not terminated and the function succeeds, the termination status returned is STILL_ACTIVE.
Return Value
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
Remarks
If the thread has terminated and the function succeeds, the termination status returned may be one of the following:
 
  • The exit value specified in the ExitThread or TerminateThread function.
  • The return value from the thread function.
  • The exit value of the thread's process.

  • Warning  If a thread happens to return STILL_ACTIVE (259) as an error code, applications that test for this value could end up in an infinite loop.
    참조 예:
     1 
    int
     main()     
     2
     {         
     3
         DWORD exitCode1 = 0;     
     4
         DWORD exitCode2 = 0;     
     5
         DWORD threadId;          
     6   
     7
         HANDLE hThrd1 = CreateThread(NULL, 0,   ThreadFunc1, 0, 0, &threadId );  
     9     
    if
     (hThrd1)     
    10
             printf("Thread 1 launched");    
    11 
    13
         HANDLE hThrd2 = CreateThread(NULL, 0,  ThreadFunc2, 0, 0, &threadId );     
    14     
    if
     (hThrd2)     
    15
             printf("Thread 2 launched");    
    16 
    18     
    for
     (;;)      
    19
         {   
    20
               printf("Press any key to exit..");   
    21
               getch();   
    22
               GetExitCodeThread(hThrd1, &exitCode1);   
    23
               GetExitCodeThread(hThrd2, &exitCode2);   
    24           
    if
     ( exitCode1 == STILL_ACTIVE )   
    25
                   puts("Thread 1 is still running!");   
    26   
    27           
    if
     ( exitCode2 == STILL_ACTIVE )   
    28
                   puts("Thread 2 is still running!");   
    29           
    if
     ( exitCode1 != STILL_ACTIVE   && exitCode2 != STILL_ACTIVE )   
    30               
    break
    ;   
    31
         }   
    32   
    33
         CloseHandle(hThrd1);   
    34
         CloseHandle(hThrd2);   
    35    
    36
         printf("Thread 1 returned %d", exitCode1);   
    37
         printf("Thread 2 returned %d", exitCode2);   
    38     
    return
     EXIT_SUCCESS;     
    39
     }    
    40   
    41
     DWORD WINAPI ThreadFunc1(LPVOID n)   
    42
     {   
    43
          Sleep((DWORD)n*1000*2);   
    44      
    return
     (DWORD)n * 10;   
    45
     } 
    46 
    48
     DWORD WINAPI ThreadFunc2(LPVOID n)   
    49
     {   
    50
          Sleep((DWORD)n*1000*2);   
    51      
    return
     (DWORD)n * 10;   
    52
     }

    좋은 웹페이지 즐겨찾기