AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Threads und StringList

Ein Thema von IMPEGA · begonnen am 24. Mai 2025 · letzter Beitrag vom 5. Jun 2025
 
IMPEGA

Registriert seit: 19. Jan 2008
Ort: Brhv
102 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#24

AW: Threads und StringList

  Alt 5. Jun 2025, 12:26
Ui, das nenne ich ausführlich. Vielen Dank.

Kleinigkeiten sofort korrigiert
"ErgebnisListe" - Das habe ich übersehen, ist in meinem Fall ganz überflüssig. Ich habe es üneral entfernt


"CSection2" - Das habe ich schon irgendwie vermutet, leider habe ich kein Plan wie man die CS richtig setzen soll. Mangel an Verständnis.
Kannst du an meinen Kode es zeigen bitte?

"ShouldStop" - Erneut Mangel an Wissen. Nach deiner Erklärung aber nachvollziehbar.

"ButtonStartClick" - Hier muss bei Weiter die Möglichkeit bestehen zu wählen, ob man weiter machen will oder nicht. Code ist nicht gleich. Später kommen noch paar weiter Abfragen.
Das mag ich so belassen wie es ist, für später Korekturen.

"FUpdateAktiv"
Das Ereignis gehört eher in OnTerminate, das spart auch das Synchronize


Das kann ich erst nicht wirklich umsetzen, muss erst darüber schlafen, und etwas lesen. Bei dem Punkt bin ich verwirrt.

"FUpdateJobs" und "FUpdateFertig"
Zu einem Ereignis zusammenfassen und dort beide Aufgaben erledigen.


Das wird sofort erledigt. Einleuchtend.

Danke sehr.
Ein Muster mit meiner CSection1 wäre super. Ich habe zwar viel darüber gelesen, bei der Menge an Sachen, bleibt nicht immer das Richtige im Kopf.

EDIT
Ich habe versucht es so anzupassen
Delphi-Quellcode:
procedure TMultiThread.Execute;
var
  FErgebnis : TstringList;
  Url : string;
  Http : TIdHTTP;
begin
  Http := TIdHTTP.Create(nil);
    try
      Http.ConnectTimeout := FTimeOut;
      Http.ReadTimeout := FTimeOut;

      while not Terminated and not FShouldStop^ do
        begin
          Url := '';

          FCSection1.Acquire;
            try
              if FUrlList.Count > 0 then
                begin
                  Url := FUrlList[0];
                  FUrlList.Delete(0);
                end;

              if Url = 'then Break;

              FErgebnis := TStringList.Create;
                try
                  try
// Http.Head(Url);

                    Sleep(Random(5000)); {Simulation einer Verzögerung}

                    FErgebnis.Add('OK: ' + Url); {Ergebnis in StringList eintragen}
                    FErgebnis.Add('Zweite Zeile');
                    FErgebnis.Add('Dritte Zeile');

                    UpdateErgebnis(FErgebnis);
                  except
                    on E: Exception do
                      begin
                        FErgebnis.Add('FAIL: ' + Url + ' - ' + E.Message);
                        UpdateErgebnis(FErgebnis);
                      end;
                  end;
                finally
                  FreeAndNil(FErgebnis);
                end;
            finally
              FCSection1.Release;
            end;

          if Assigned(FUpdateJob) then
            begin
              TThread.Synchronize(nil, procedure
                begin
                  FUpdateJob(Self);
                end);
            end;
        end;
    finally
      FreeAndNil(Http);

      if Assigned(FUpdateAktiv) then
        begin
          TThread.Synchronize(nil, procedure
            begin
              FUpdateAktiv(Self);
            end);
        end;
    end;
end;
Nun verhält sich das Ganze als ob es nur ein Thread ist.
Egal wie hoch ich Sleep setze. Antworten kommen immer von nachfolgendem Thread
Also immer gleich
OK: http://google.com/0
Zweite Zeile
Dritte Zeile

OK: http://google.com/1
Zweite Zeile
Dritte Zeile

OK: http://google.com/2
Zweite Zeile
Dritte Zeile

OK: http://google.com/3
Zweite Zeile
Dritte Zeile

OK: http://google.com/4
Zweite Zeile
Dritte Zeile

Die Antwortzeit ist natürlich unterschiedlich, wegen Random
Wenn ich die CS weglasse, kommen die Antworten immer durchgemischt, so wie man es von Threads erwartet. Auch mit unterschiedlichen Zeiten, doch sobald ein Thread fertig ist kommt die Antwort.
Also mache ich noch etwas falsch. Oder?

Wenn ich die CS durch
System.TMonitor.Enter(Self);
...
...
System.TMonitor.Exit(Self);

dann funktioniert es wie es soll.

Geht es überhaupt so? TMonitor habe ich noch nie benutzt.

Geändert von IMPEGA ( 5. Jun 2025 um 13:38 Uhr)
  Mit Zitat antworten Zitat
 


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 00:49 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