mam kod w Delphi, który wykonuje następujące czynności:po zakończeniu() wątku (klasy TThread), czy kończy się każde dziecko tego wątku?
procedure THilo.Execute; // (which is the thread)
begin
inherited;
FreeOnTerminate := True;
while not Terminated do
begin
(...)
Sleep(100);
end;
end;
a teraz gdzieś indziej, w innym wątku (lub GUI) możemy to zrobić:
var
Hilo2: THilo;
begin
Hilo2 := THilo.Create(True);
Hilo2.start;
Hilo2 := THilo.Create(True);
Hilo2.start;
end;
teraz mamy wykonywane 2 razy ten sam wątek i działają równolegle. Co się stanie, jeśli zrobimy to teraz ?:
Hilo2.Terminate;
Czy to zakończy oba wątki, czy tylko 1, lub co? również, jeśli chcielibyśmy go zakończyć, możemy to osiągnąć przez .Resume()?
góry dzięki
Dzięki J, miałem w swoim programie to i nie mogłem zakończyć wątków , więc byłoby to naprawione za pomocą tablicy TThread, prawda? jak 'Hilo [i]: = THilo.Create (prawda); Hilo [i] .start; ' – user2308704
Oh - inny doświadczony programista wielowątkowy Delphi. To sprawia, że co najmniej dwie z nas :) –
Ponieważ używane jest 'FreeOnTerminate = True', jeśli wątek kończy się przedwcześnie (nieprzechwycony wyjątek, itp.), Wywołanie' Terminate() 'może się nie udać (lub, co gorsza, uszkodzić pamięć) jeśli wątek już zniknął. 'FreeOnTerminate = True' powinno być używane tylko dla wątków tworzenia i zapominania. Jak tylko będziesz musiał dotknąć zewnętrznego wątku ** z powodu ** (zawieszenie/wznowienie, zakończenie/oczekiwanie, aktualizacje/dostęp do członków, itp.), Nie używaj 'FreeOnTerminate = True'! –