Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi TThread, irgendwas mache ich falsch (https://www.delphipraxis.net/196215-tthread-irgendwas-mache-ich-falsch.html)

KodeZwerg 2. Mai 2018 02:14

TThread, irgendwas mache ich falsch
 
Hallo, im folgenden zeige ich eine Pseudo-Funktion die einen Thread startet, trotzdem friert das Programm ein, ich finde nicht meinen Fehler, fällt jemand auf was ich falsch mache dann bitte Hilfe! :thumb:

Ziel sollte sein den Mainthread zu entlasten aber nach wie vor als eine Funktion zu arbeiten wenn im Hauptcode angesprochen (deswegen repeat schleife)
Delphi-Quellcode:
function TFormMain.Machwas ( Const Input : String ) : String;
var
 tmp : String;
 threadrun: boolean;
begin
  threadrun := True;
  TThread.CreateAnonymousThread(
    procedure
    var
     IchBraucheDieseVars: Definitionen;
    begin
      tmp := '';
      IchBraucheDieseVars := IrgendWas.Create;
    try
      tmp := IchBraucheDieseVars.GibMirEinenStringVonWoanders(Input);
    finally
      IchBraucheDieseVars.Free;
    end;
    threadrun := False
    end
  ).Start;
  repeat sleep(5) until not threadrun;
  Result := tmp;
end;
edit
Mit einfrieren meine ich nicht dass das Programm abstürzt sondern hängen bleibt bis funktion fertig ist.
PS: Es friert auch nicht wegen hoher Cpu Last ein, die ist lächerlich gering.

himitsu 2. Mai 2018 03:55

AW: TThread, irgendwas mache ich falsch
 
Dein Hauptthread besteht ausschließlich aus dieser Zeil
Delphi-Quellcode:
repeat sleep(5) until not threadrun;

und nun überlege mal ganz genau was da gemacht wird und wieso es da hängen muß.

Und sollte es mal beim Free knallen, dann bleibt es auch gleich für immer hängen.

Shadowwalker 2. Mai 2018 07:46

AW: TThread, irgendwas mache ich falsch
 
Durch die Zeile
Delphi-Quellcode:
  repeat sleep(5) until not threadrun;
nach .Start; hebst du die Wirkung des Threads wieder komplett auf.

haentschman 2. Mai 2018 08:20

AW: TThread, irgendwas mache ich falsch
 
Moin...:P
Ich weiß nicht wie weit du drinsteckst...es hilft vieleicht (TThread Grundlagen): https://www.delphi-treff.de/tutorial...ascal/threads/

Nathan 2. Mai 2018 08:23

AW: TThread, irgendwas mache ich falsch
 
Wäre dafür nicht das Konzept Futures aus der Delphi Parallel Library. Schau mal unter:
https://www.delphi-treff.de/tutorial...lel-library/4/
http://docwiki.embarcadero.com/RADSt...amming_Library

Shadowwalker 2. Mai 2018 08:42

AW: TThread, irgendwas mache ich falsch
 
Das Problem hier wird sein, dass er eine Funktion als Thread ausführen möchte, aber gleichzeitig im Mainthread auf das Ergebnis warten muss.

himitsu 2. Mai 2018 08:57

AW: TThread, irgendwas mache ich falsch
 
Zitat:

Zitat von Shadowwalker (Beitrag 1401028)
aber gleichzeitig im Mainthread auf das Ergebnis warten muss.

Oder seine Methode ist die Falsche/Unpassende.

Im Thread oder sonstwo was machen, im Hauptthread darauf warten, aber dem Hauptthread Rechenleistung abgeben. (ProcessMessages)

Oder im Thread was machen, im Hauptthread nicht warten und bei ThreadEnde den Hauptthread benachrichtigen (Callback, Message oder Dergleichen),
bzw. im Hauptthread regelmäßig schauen ob fertig und dann das Ergebnis abholen (pollen > Timer).


Und da der Thread selber auch nichts macht, wäre noch die Überlegung, ob ein Thread überhaupt notwendig ist.
Datei- und Streamingfunktion und auch irgendwelches INet-Download-Zeugs (ich vermute mal um Letzteres geht es) muß nicht immer blockierend arbeiten, was sich dann ebenfalls mit Erster und den anderen Lösungen kombinieren ließe.

p80286 2. Mai 2018 09:04

AW: TThread, irgendwas mache ich falsch
 
Zitat:

Zitat von KodeZwerg (Beitrag 1401015)

Ziel sollte sein den Mainthread zu entlasten aber nach wie vor als eine Funktion zu arbeiten wenn im Hauptcode angesprochen (deswegen repeat schleife)

Nö, das geht nicht (OK, man kann es gehend machen) und es ist unnötig. Ein Thread hat eine Aufgabe zu erledigen. Für diese wird er aufgerufen. Wenn diese erledigt ist ist zwar der Code noch vorhanden aber der Thread selbst ist nicht mehr aktiv. Falls die Aufgabe nochmals zu erledigen ist, wird er erneut aufgerufen.

Gruß
K-H

himitsu 2. Mai 2018 09:23

AW: TThread, irgendwas mache ich falsch
 
@p80286: Du hast seinen Code und diese Aussage falsch verstanden.

Diese Schleife hat nichts mit dem Thread zu tun.
Sie soll nur warten und dafür ist "diese" Schleife garnicht nötig.
Einfache Abänderung, mit dem selben Ergebnis: Ein Event und WaitFor statt dieser Schleife.


Er kann bei sich auch das Sleep weglassen. Dann ist der Code kürzer, das Warten verbrät 100% CPU, aber sonst ändert sich nichts.

Mavarik 2. Mai 2018 09:54

AW: TThread, irgendwas mache ich falsch
 
Ein generelles Problem...

Es gibt im Hauptthread keine Procedure Execute_Modal_In_Thread;. Wie himitsu schon geschrieben hat...

Ein

Delphi-Quellcode:
Procedure Button1Click(Sender : TObject);
begin
  MachWaslangesImThread;
  IchWarteHiersolangenonBlocking;
end;
Geht leider nicht...

Alle Repeat Processmessages Until Konstrukte verbraten nur mehr CPU-Zeit, als wenn man es direkt im UI-Thread erledigt hätten.

Also die Logik umbauen auf.


Delphi-Quellcode:
Procedure Button1Click(Sender : TObject);
begin
  ShowWait;
  MachWaslangesImThreadAsync(Procedure (Data : TData)
    begin
      IcharbeitemitdemErgebnis(Data);
      HideWait;
    end);
end;
Wird zwar dadurch nicht schneller, aber die Oberfläche bleibt reaktiv.

Multithreading lohnt sich "eigentlich" nur da, wo der User nicht unbedingt auf ein Ergebnis wartet.

Beispiel (Schönwetter Code, wie Bernd sagen würde) :

Delphi-Quellcode:
Procedure SaveButton(Sender : TObject);
begin
  SaveButton.Enabled := false;
  TTask.Run(Procedure
    begin
      SpeicherdieDaten;  
      TThread.Queue(NIL,Procedure
        begin
          ShowFlyInMessage('Daten gespeichert');
          SaveButton.Enabled := true;
        end;
    end);
end;
Nur mal so als Anregungen.

Mavarik :coder:


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:01 Uhr.
Seite 1 von 5  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz