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 2  1 2      
Benutzerbild von himitsu
himitsu

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

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.
Ein Therapeut entspricht 1024 Gigapeut.

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.165 Beiträge
 
Delphi 10.3 Rio
 
#2

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
Benutzerbild von p80286
p80286

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

AW: TThread, irgendwas mache ich falsch

  Alt 2. Mai 2018, 12:23
@p80286: Du hast seinen Code und diese Aussage falsch verstanden.
Mag sein, aber ich habe schon soviel Multitasking-Voodoo gelesen, darum wundert mich nichts.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.291 Beiträge
 
Delphi 12 Athens
 
#4

AW: TThread, irgendwas mache ich falsch

  Alt 2. Mai 2018, 13:01
Tut sich nicht jeder am Anfang schwer wenn er in Parallelprogrammierung einsteigt? Ich habe selbst derzeit auch so ein verwandtes Thema am kochen. Ich denke, bei Parallelisierung braucht es mehr als anderswo eine gute konzeptionelle Vorarbeit. Einfach drauflos und gucken was passiert ist IMHO der falsche Weg.

Ich selbst habe mir Threads immer so vorgestellt wie Systemdienste beim Windows. Laufen im Hintergrund und erledigen Aufgaben, die nicht visualisiert werden müssen. Wenn sie fertig sind oder zwischendurch Statusmeldungen absondern müssen, dann über synchronisierte Eventhandler zum GUI-Hauptthread hin. Deshalb ist es ja auch gerade so widersinnig, den Hauptthread in eine repeat-until-Schleife zu schicken, während der Thread im Hintergrund sein Werk tut. Das wäre ja so als müsste man an einem Windows Domaincontroller erstmal alle Dienste beenden, um über das GUI eine Wartung vornehmen zu können.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: TThread, irgendwas mache ich falsch

  Alt 2. Mai 2018, 13:26
Ja Danke für Eure Aussagen,
himitsu hat Recht, es handelt sich um die inet-download Geschichte.
Ich werde mich mal bei den Links von euch durchlesen wie ich es korrekt anstellen sollte.

Es geht mir nicht um parallele Threads, einfach nur ein Thread der arbeitet und wenn er fertig ist mir ein Ergebnis liefert aber solange wie er arbeitet das Programm nicht blockiert wird, und das ganze bei Laufzeit.
Da soll noxh eine Thread-Abbruch Funktion rein damit sich das ganze Thread Gedöns auch lohnt nur kann ich nicht den Abbruch-Knopf drücken weil "keine Rückmeldung" erscheint.

Einfache Abänderung, mit dem selben Ergebnis: Ein Event und WaitFor statt dieser Schleife.
Ja das versuche ich gerade innerhalb der Funktion umzusetzen/einzubauen. Ich hoffe in einem der Links steht was darüber


Das mit Future ist die falsche Richtung, Danke für die Hinweise @mehrere

edit
Code:
WaitForSingleObject(MyThread.Handle, INFINITE);
Das teste ich gerade als Ersatz für die repeat Schleife aber Programm friert immer noch ein.

So sieht jetzt eine real-Funktion aus:
Delphi-Quellcode:
function TFormMain.GetTHTTPClient ( Const xURL : String ) : String;
var
 tmp : String;
 MyThread: TThread;
begin
  tmp := '';
  MyThread := TThread.CreateAnonymousThread(
    procedure
    var
     HttpClient: THttpClient;
     HttpResponse: IHttpResponse;
    begin
      tmp := '';
      HttpClient := THTTPClient.Create;
      try
        HttpResponse := HttpClient.Get( xURL );
        tmp := HttpResponse.ContentAsString();
      finally
        HttpClient.Free;
      end;
    end
  );
  MyThread.FreeOnTerminate := True;
  MyThread.Start;
  WaitForSingleObject(MyThread.Handle, INFINITE);
  Result := tmp;
end;
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 2. Mai 2018 um 14:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: TThread, irgendwas mache ich falsch

  Alt 2. Mai 2018, 14:14
Es geht mir nicht um parallele Threads, einfach nur ein Thread der arbeitet und wenn er fertig ist mir ein Ergebnis liefert aber solange wie er arbeitet das Programm nicht blockiert wird, und das ganze bei Laufzeit.
Unter Windows gibt es immer einen "MainThread" der nichts anderes Tut als

Code:
repeat
  GibtesMessages;
  verarbeiteMessages;
  Gibtes Events;
  VerarbeiteEvents;
  // ab hier meine Erweiterungen
  Machwas;
until terminated;
Wenn Machwas zeitaufwendig ist, dann macht das Programm den Eindruck eingefroren zu sein.
Um dieses Einfrieren zu verhindern, wird die zeitaufwendige Aktion in einen seperaten Thread ausgelagert, damit der Hauptthread wieder seiner Aufgabe "Anzeigen und Reagieren" nachkommen kann.

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
44.555 Beiträge
 
Delphi 12 Athens
 
#7

AW: TThread, irgendwas mache ich falsch

  Alt 2. Mai 2018, 14:24
Einfache Abänderung, mit dem selben Ergebnis: Ein Event und WaitFor statt dieser Schleife.
Ja das versuche ich gerade innerhalb der Funktion umzusetzen/einzubauen. Ich hoffe in einem der Links steht was darüber
Das war gerade DAS Antibeispiel, wo man auch im Code gleich sieht, dass es hängen muß.

Das mit Future ist die falsche Richtung, Danke für die Hinweise @mehrere
Wieso?
> Mach was und wenn fertig gib es mir.

Um dieses Einfrieren zu verhindern, wird die zeitaufwendige Aktion in einen seperaten Thread ausgelagert, damit der Hauptthread wieder seiner Aufgabe "Anzeigen und Reagieren" nachkommen kann.
Oder der Entwickler muß dem Hauptthread regelmäßig die Möglichkeit geben etwas anderes tun zu können.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 2. Mai 2018 um 14:26 Uhr)
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
454 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: TThread, irgendwas mache ich falsch

  Alt 2. Mai 2018, 14:33
Grundsätzlich geht es dabei wohl darum wie man das Ergebnis aus dem Thread kriegt. Ganz einfach wäre folgendes:

Delphi-Quellcode:

procedure TMainForm.GetTHTTPClient ( Const xURL : String );
begin
  TThread.CreateAnonymousThread(
    procedure
    var
     HttpClient: THttpClient;
     HttpResponse: IHttpResponse;
     LTmp: String;
    begin
      Ltmp := '';
      HttpClient := THTTPClient.Create;
      try
        HttpResponse := HttpClient.Get( xURL );
        Ltmp := HttpResponse.ContentAsString();
      finally
        HttpClient.Free;
        TThread.Synchronize(TThread.Current,
          Procedure
          begin
            DoneWithIt(Ltmp);
          end
        );
      end;
    end
  ).Start;
end;

procedure TMainForm.DoneWithIt(const Data: String);
begin
  label1.Caption := 'DoneWithIt: '+Data;
end;
Natürlich muss es dann noch einen entsprechenden Label geben, oder man macht mit Data was immer man möchte...
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: TThread, irgendwas mache ich falsch

  Alt 2. Mai 2018, 14:54
  while WaitForSingleObject(MyThread.Handle, INFINITE) = WAIT_OBJECT_0 do Application.ProcessMessages; scheint auch nicht zu helfen.
@Whookie: Ich verstehe zwar wie Du es meinst aber kann es so noch nicht praktikabel umsetzen.
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 2. Mai 2018 um 15:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: TThread, irgendwas mache ich falsch

  Alt 2. Mai 2018, 15:01
Du wartest ja auch unendlich lange

Mach ein Timeout von wenigen Millisekunden und dann gehts auch.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 07:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz