Skocz do zawartości

Jak zgrabnie przerwać wątek


Fragment

Recommended Posts

Czy ktoś wie w jaki sposób wątek może przerwać działanie innego wątku. Z góry wykluczam użycie funkcji TerminateThread(), ze względu na to że pozostawia ona po sobie śmieci (np. stos zamkniętego wątku). Poza tym Microsoft nie zaleca jej używania. Zaleca funkcję ExitThread(), ale ta może być wywołana tylko przez zamykany watek.

Link do komentarza
Udostępnij na innych stronach

Kod w MFC ale ide ta sama:

Sprobuj tak:

//
m_pThread = AfxBeginThread(ThreadProc, &m_bThreadActive);

// ...

//
UINT ThreadProc(LPVOID _pParam)
{
   BOOL* _pbThreadActive = (BOOL*)_pParam;
   
   //
   while(*_pbThreadActive)
   {
      // ...
   }

   return 0;
}

Gdzies tam w programie ustawiasz m_bThreadActive na FALSE i po klopocie.

Tylko pilnuj zeby m_bThreadActive nie wyszla poza zakres, najlepiej zrobic ja jako globalna lub jak zaznaczylem (m_) czlonek klasy :)

Link do komentarza
Udostępnij na innych stronach

Dzięki za odpowiedź. Jest to rozwiązanie podobne do tego z dokumentacji SDK, tylko że tam zamiast zmiennej globalnej zaleca się stosowanie event Obcject. Jednak nie rozwiązuje to mojego problemu. W moim programie zamykany wątek ma wykonywać czytanie i zapis do gniazda blokowanego. Tak więc może zdarzyć się sytuacja gdy wątek będzie czekał na odczyt danych z gniazda po wywołaniu funkcji recv() i w tym czasie nie będzie go można w żaden sposób zamknąć stosując te rozwiązanie. Ostatnio jednak doczytałem się, że do gniazda można przypisać uchwyt obiektu jądra, na którym można za pomocą funkcji WSAwaitForMultipleObjects() oczekiwać na nadejście danych do gniazda. Jednocześnie można zastosować globalny event object, który sygnalizowałby chęć zamknięcia wątku. Gdybyśmy wywołując funkcję wsaWaitForMultipleObjects() czekali albo na jego ustawienie albo na nadejście danych do gniazda, problem byłby rozwiązany. Zaznaczam że nie sprawdziłem działania tego mechanizmu. Wszytko to jednak wydaje mi się strasznie toporne. Pod Unixem do sterowania działaniem innych procesów można używać sygnałów, które docierają do nich natychmiast i proces może także natychmiast na niego zareagować. Myślałem, że pod windowsem będzie coś podobnego.

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...