Fragment Napisano Kwiecień 22, 2019 Autor Zgłoś Udostępnij Napisano Kwiecień 22, 2019 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. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Visage Napisano Kwiecień 23, 2019 Zgłoś Udostępnij Napisano Kwiecień 23, 2019 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 :) Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Fragment Napisano Kwiecień 23, 2019 Autor Zgłoś Udostępnij Napisano Kwiecień 23, 2019 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. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.