AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi TThread, irgendwas mache ich falsch
Thema durchsuchen
Ansicht
Themen-Optionen

TThread, irgendwas mache ich falsch

Ein Thema von KodeZwerg · begonnen am 2. Mai 2018 · letzter Beitrag vom 5. Mai 2018
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#1

TThread, irgendwas mache ich falsch

  Alt 2. Mai 2018, 02:14
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!

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.
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 2. Mai 2018 um 02:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#2

AW: TThread, irgendwas mache ich falsch

  Alt 2. Mai 2018, 03:55
Dein Hauptthread besteht ausschließlich aus dieser Zeil 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 2. Mai 2018 um 03:59 Uhr)
  Mit Zitat antworten Zitat
Shadowwalker

Registriert seit: 23. Apr 2018
22 Beiträge
 
#3

AW: TThread, irgendwas mache ich falsch

  Alt 2. Mai 2018, 07:46
Durch die Zeile   repeat sleep(5) until not threadrun; nach .Start; hebst du die Wirkung des Threads wieder komplett auf.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.297 Beiträge
 
Delphi 12 Athens
 
#4

AW: TThread, irgendwas mache ich falsch

  Alt 2. Mai 2018, 08:20
Moin...
Ich weiß nicht wie weit du drinsteckst...es hilft vieleicht (TThread Grundlagen): https://www.delphi-treff.de/tutorial...ascal/threads/
  Mit Zitat antworten Zitat
Nathan

Registriert seit: 6. Nov 2003
Ort: Birmensdorf / Zürich
29 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: TThread, irgendwas mache ich falsch

  Alt 2. Mai 2018, 08:23
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
Nathan Chanan Thurnreiter
  Mit Zitat antworten Zitat
Shadowwalker

Registriert seit: 23. Apr 2018
22 Beiträge
 
#6

AW: TThread, irgendwas mache ich falsch

  Alt 2. Mai 2018, 08:42
Das Problem hier wird sein, dass er eine Funktion als Thread ausführen möchte, aber gleichzeitig im Mainthread auf das Ergebnis warten muss.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#7

AW: TThread, irgendwas mache ich falsch

  Alt 2. Mai 2018, 08:57
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 2. Mai 2018 um 09:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: TThread, irgendwas mache ich falsch

  Alt 2. Mai 2018, 09:04

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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#9

AW: TThread, irgendwas mache ich falsch

  Alt 2. Mai 2018, 09:23
@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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 2. Mai 2018 um 09:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: TThread, irgendwas mache ich falsch

  Alt 2. Mai 2018, 09:54
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:47 Uhr.
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