Skocz do zawartości

[Turbo Delphi]TThread sprawdzanie


5corpio

Polecane posty

Tworzę teraz pewną aplikacje w której muszę korzystać z wątków - niestety :) czyli pomagam sobie do tego klasą TThread. Trochę kombinowałem i chce się upewnić w przekonaniu:

 

Mam klasę swoją opartą o TThread i ustawione w niej: FreeOnTerminate := True. Skasowanie wątku potwierdzam sobie poprzez wrzucenie do destruktora zwykłego np. WriteLn('Skasowano'). Ale teraz zauważyłem, że: Po skasowaniu wątku objekt nie jest ustawiany domyślnie na nil?

 

Bo muszę recznie ustawiać potem objekt na nil pomagając sobie w tym funkcją: WaitForSingleObject i sprawdzać wartość WAIT_OBJECT_0.

 

Ogólnie schemat mam taki:

  1. Wątek nadrzędny (działający cały czas)
    • Sprawdzamy czy not Assigned(watek_dziecko) jesli nie to tworzymy ten wątek, który się wykonuje... wykonuje a potem sam się kasuje rzecz jasna. Ale w tym momencie nie jest on ustawiony na nil! Ponieważ przy kolejnym dalszym działaniu wątku głownego sprawdzanie Assigned(Watek_dziecko) daje juz fałsz.

Nie cierpię bawienia się w te wątki a potem muszę to rozszerzyć jeszcze nie o jeden a o więcej :) Więc liczę na jakieś pomysły kogoś czy dobrze rozumuje, że sam muszę się zająć ustawianiem potem stanu objektu na nil? Ew. jak sprawdzacie w jakiś fajny sposób, który wątek np. w tablicy już nie działa? Wiem, że jest WaitForMultiple... ale muszę jeszcze w ogarnąć dokłądnie tą funkcje bo ona chyba sprawdza czy wszystkie są danego stanu.

 

Bo w chwili obecnej moje rozwiązanie działa ale wolałbym mieć wszystko skodzone w miarę ok z racji tego, że z tymi wątkami to nigdy nic nie wiadomo :)

Ot taka mini-strona moja po godzinach :)http://www.wnetrzekuchni.pl

Link do komentarza
Udostępnij na innych stronach

  • 3 weeks later...

Nie do końca rozumiem całość problemu ale możesz chyba zastosować takie coś.

Przed uruchomieniem wątku ustaw mu pole z jakimś identyfikatorem (index tablicy albo klucz w mapie czy co tam używasz). Na końcu metody wątku (chyba execute było w TThread) sięgnij do kolekcji która zawiera wątek i usuń go z niej.

 

Inna droga to dodanie listenera do każdego wątka. Listener może być informowany o zmianach stanu np onStart, onEnd i w reakcji na to kasować co potrzeba.

 

Chyba że nic nie skumałem i nie o to chodzi.

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

  • 1 month later...

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...