[Delphi] Wątki a procedury zewnętrzne

0

Siemano. Mam pytanie co to klasy TThread no i w sumie nie tylko. Przykładowo:

Mam procedure Execute wątku Twatek. Uruchamiam tą procedurę. (uruchamiam wątek)
Następnie w tej procedurze jest wywołanie procedury, która nie należy do Twatek, dokladniej do Tform1.Procedurka();
Wywołanie takiej procedury w Twatek.execute (procedura watku) a następnie zatrzymanie wątku poprzez Twatek.terminate itp spowoduje także zatrzymanie pracy procedury Tform1.Procedura.

Inaczej mówiąc zatrzymanie wątku spowoduje także zatrzymanie wszystkich wywołanych przez nią zewnętrznych działających procedur, które nie są zadeklarowane w klasie wątku. Da się jakoś to zrobić by tak nie było? Żeby zewnętrzna procedura wywołana w wątku nie zatrzymywała się po zatrzymaniu i zniszczeniu wątku?

Pozdrawiam!

0

Musi być wywołana w jeszcze innym wątku.

0

to nie jest prawda - aby zatrzymać wątek przez TWatek.Terminate wątek musi sprawdzić czy zmienna Terminate jest ustawiona na true i zakończyć pętlę główną - zazwyczaj wygląda ona mniej więcej tak:

procedure Execute;
begin
  while not Terminate do
  begin
    //jakieś coś
  end;
end;

I teraz jeśli wywołujesz jakąkolwiek procedurę/funkcję/metodę to sterowanie wróci do tej pętli dopiero jak skończy się wykonywać wywołana procedura.
BTW wywoływanie metody formy z wątku to bardzo zły pomysł

0

wiem wiem dałem przykład. Ale przykładowo mamy taki kod:

Procedure Twatek1.execute;
var
...
begin
freeonterminate := true
...
inc(x);
twatek2.execute;
inc(x);
end;

Kiedy odpalę Twatek1.execute i on jak widać uruchomi watek2.execute a następnie zakończy się. Kiedy watek1 zakończy swoje działanie, jednocześnie kończy działać watek2.

jak np wrzucę Twatek2.execute do timera, a następnie w watek1.execute zamiast odpalania drugiego wątku napisze timer1.enabled := true to wszystko pujdzie jak należy, watek1 sie zakończy, a po chwili odpali z timera watek2. ale to nie o to chodzi, tak wręcz nie można. Zresztą wyobraź sobie akcelerator pobierania plików działający na tej zasadzie...

0
Legalnl napisał(a)
Procedure Twatek1.execute;
var
...
begin
freeonterminate := true
...
inc(x);
twatek2.execute;
inc(x);
end;

to wcale nie uruchamia drugiego wątku!!!! To tylko i wyłącznie wywołuje jego metodę.

A z tego co widzę to próbujesz zrobić coś co robi się całkiem inaczej. Może napisz co chcesz osiągnąć i do czego ci to potrzebne

0

no zapewne źle robie, ale nie wiem jak inaczej. Przykładowo mam wątek, który pobiera jakieś tam dane z internetu, i chcę by po zakończeniu wątku wykonała się jakaś zewnętrzna procedura lub uruchomił się jakiś wątek. Próbowałem też z DoTerminate, jednak to samo się dzieje.

0

masz dwa wątki TWatek1 i TWatek2

procedure TWatek.Execute;
begin
  while not Terminate do
  begin
    //whatewer
  end;
  TWatek2.Create(False);
end;

po zakończeniu wątku 1 odpali się wątek 2. Tak jest najprościej. Możesz też obsłużyć OnTerminate wątku1 i tam odpalić wątek2

1 użytkowników online, w tym zalogowanych: 0, gości: 1