Einzelnen Beitrag anzeigen

IMPEGA
Online

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

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