AnonymousThread result?

0

mam funkcję:

function MojaFunkcja(parametr:string) : string;
begin
      TThread.CreateAnonymousThread(procedure ()
      var temp : string;
      begin
           temp := paramet;
           //jakieś działania na zmiennej temp
           result := temp; <-- tutaj błąd bo jesteśmy w procedurze
      end).Start;
end;

jak zrobić, aby MojaFunkcja zwróciła to co jest po zakończeniu wątku w zmiennej temp?

function MojaFunkcja(parametr:string) : string;
vat temp : string;
begin
      TThread.CreateAnonymousThread(procedure ()
      begin
           temp := paramet;
           //jakieś działania na zmiennej temp
      end).Start;
result := temp;
end;

w ten sposób kompiluje się ale zwraca pusty string. funkcja zwraca result i nie czeka na zakończenie wątku.

A może ja to źle robię bo nie znalazłem żadnego przykładu jak to zrobić w ten sposób?

0

Jeśli chcesz czekać na zakończenie obliczeń, po co w ogóle odpalasz wątek?

0
Patryk27 napisał(a):

Jeśli chcesz czekać na zakończenie obliczeń, po co w ogóle odpalasz wątek?

Bo to będzie aplikacja typu usługa i mogę mieć wiele wywołań różnych funkcji.
I nie chcę czekać na jakieś małe funkcje jeśli działa jakaś duża.

0
  myThread := TThread.CreateAnonymousThread(...);
  myThread.OnTerminate := ThreadTerminated;
  myThread.Start;
0

I nie chcę czekać na jakieś małe funkcje jeśli działa jakaś duża.

No ale przecież ostatecznie każde wywołanie MojaFunkcja i tak będzie czekać, bo potrzebujesz znać jej rezultat ;-p

Ten wątek tutaj nie daje absolutnie nic.

0

A jeśli wywołam MojaFunkcja która działa długo, i wywołam InnaFunkcja to bez wątku będę musiał czekać na zakończenie tej pierwszej żeby wykonała się ta druga. Zgadza się?

1

Z wątkiem też, bo MojaFunkcja zatrzyma wykonywanie programu do czasu policzenia rezultatu.

Jeden wątek (ten wykonujący MojaFunkcja() i resztę Twojego kodu) będzie czekał na drugi wątek (ten odpalony wewnątrz MojaFunkcja()) - absolutnie zero zysku i wielowątkowości.

Jeśli są to Twoje początki z programowaniem wielowątkowym, radzę Ci zacząć od prostszych rzeczy, abyś zrozumiał sam koncept - to naprawdę nie działa tak, że a utworze se wątek i program będzie 200% szybszy.

0
satq napisał(a):

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Using_the_Asynchronous_Programming_Library

A co to niby ma dać jak on chce właśnie aby wątek był wywołany synchroniznie, bo i tak musi czekać na wynik operacji w nim wykonywanych (czyli powinien użyć metody WaitFor klasy TThread) ale w takim wypadku stosowanie tutaj wątku nie ma sensu.
Swoją drogą może i dałoby się to zrobić sensownie w wątku (lub nawet kilku) ale wcześnie trzeba by wiedzieć konkretnie o co chodzi, bo być może autor tematu próbując to zrobić jak w podanym przez niego przykładzie zabiera się do tego od D strony i teraz wygląda na to, że chce tam upchać wątek na siłę.

0
kAzek napisał(a):

A co to niby ma dać jak on chce właśnie aby wątek był wywołany synchroniznie, bo i tak musi czekać na wynik operacji w nim wykonywanych (czyli powinien użyć metody WaitFor klasy TThread) ale w takim wypadku stosowanie tutaj wątku nie ma sensu.

Niekoniecznie – jeśli obliczenia trwają długo (np. kilka minut), to przeniesienie ich do wątku pobocznego ma sens, jeśli potrzebuje mieć odblokowany interfejs lub (dodatkowo) zezwolić użytkownikowi na przerwanie wykonywania obliczeń za pomocą stosownego przycisku. Choć w takim przypadku pewnie możnaby wątków pobocznych uniknąć, dbając po prostu o płynne przetwarzanie komunikatów okna.

Ale że szczegółów brak, to trudno powiedzieć czy wątki poboczne mają tutaj sens.

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