[WinAPI] Cum verific daca un thread este activ?

Folosire Windows API in programe C/C++ (forum moderat)
Post Reply
User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

[WinAPI] Cum verific daca un thread este activ?

Post by Ovidiu Cucu » 07 Jul 2011, 16:13

Intrebare
Cum verific daca un thread este activ?

Raspuns
O metoda des intalnita la un search pe net este folosind functia WinAPI GetExitCodeThread.
Daca aceasta intoarce valoarea STILL_ACTIVE, inseamna ca thread-ul este activ.

Exemplu

Code: Select all

DWORD CheckThreadIsActive(DWORD dwThreadID, BOOL& bIsActive)
{
   bIsActive = FALSE;
   HANDLE hThread = ::OpenThread(THREAD_QUERY_INFORMATION, FALSE, dwThreadID);
   if(NULL == hThread)
      return ::GetLastError();
   
   DWORD dwExitCode = 0;
   BOOL bRet = ::GetExitCodeThread(hThread, &dwExitCode);
   ::CloseHandle(hThread);
   if(! bRet)
      return ::GetLastError();

   if(STILL_ACTIVE == dwExitCode)
      bIsActive = TRUE;
   
   return NO_ERROR;
}
Aceasta metoda este OK dar are un mic dezavantaj. Este posibil ca un thread sa se fi fost terminat returnand chiar valoarea STILL_ACTIVE putand duce astfel la o concluzie gresita.

Alta metoda mai sigura este apeland functia WaitForSingleObject careia ii pasam valoarea 0 (zero) pentru time-out. In acest caz, WaitForSingleObject intoarce imediat iar daca valoarea de return este WAIT_TIMEOUT, atunci threadul este activ.

Exemplu

Code: Select all

DWORD CheckThreadIsActive(DWORD dwThreadID, BOOL& bIsActive)
{
   bIsActive = FALSE;
   HANDLE hThread = ::OpenThread(SYNCHRONIZE, FALSE, dwThreadID);
   if(NULL == hThread)
      return ::GetLastError();

   DWORD dwRet = ::WaitForSingleObject(hThread, 0);
   ::CloseHandle(hThread);
   if(WAIT_FAILED == dwRet)
      return ::GetLastError();

   if(WAIT_TIMEOUT == dwRet)
      bIsActive = TRUE;

   return NO_ERROR;
}

Note
  • Pentru GetExitCodeThread, handle-ul thread-ului trebuie sa aiba dreptul de acces THREAD_QUERY_INFORMATION.
  • Pentru WaitForSingleObject, handle-ul thread-ului trebuie sa aiba dreptul de acces SYNCHRONIZE.
Resurse
<< Back to Windows API Index



Post Reply