Jak poprawnie zakończyć wiszące wątek wewnątrz biblioteki DLL?

Cześć wszystkim,

Mam bibliotekę innej firmy, która zawiera błąd. Gdy wywołam funkcję, może się zawiesić. Funkcja biblioteki jest wywoływana wewnątrz biblioteki DLL. Postanowiłem przenieść rozmowę do wątku i poczekać jakiś czas. Jeśli wątek został zakończony, OK. Jeśli nie - powinienem ją zakończyć obowiązkowo.

Uproszczony przykład tutaj:

<code>unsigned Counter = 0;
void f()
{
    HANDLE hThread;
    unsigned threadID;

    // Create the second thread.
    hThread = (HANDLE)_beginthreadex( NULL, 0, DoSomething, NULL, 0, &threadID );

    if (WAIT_TIMEOUT == WaitForSingleObject( hThread, 5000 ))
    {
        TerminateThread(hThread, 1);    
        wcout << L"Process is Timed Out";
    }
    else
    {
        wcout << L"Process is Ended OK";
    }

    CloseHandle(hThread);   

    wcout << Counter;
}

unsigned int _stdcall DoSomething( void * /*dummy*/ )
{
    while (1)
    {

        ++Counter;

    }
    _endthreadex( 0 );
    return 0;
}
</code>

Pytanie

TheTerminateThread () funkcja nie jest zalecana do dzwonienia.Jak wspomniałem wcześniej, wątek jest uruchomionywewnątrz biblioteki. Jeśli zakończę wątek za pomocąTerminateThread () mój dll nie rozładowałby sięFreeLibrary () lub nawetFreeLibraryAndExitThread (). Obie funkcje zawieszają się.

Jak zakończyć wątek i zachowaćFreeLibrary () pracujący?

Dzięki.

questionAnswers(1)

yourAnswerToTheQuestion