Einzelnen Beitrag anzeigen

IMPEGA

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

AW: Threads und StringList

  Alt 26. Mai 2025, 20:42
Ok, also ist das Teil praktisch ...hmmm komplett falsch ?
Mit Timeout, nach deiner Erklärung kann ich nachvollziehen, daran habe ich leider nicht gedacht. Timeout kann ich irgendwie global setzen, oder eben in Create packen.
Das zu ändern, ist kein Problem.
Der Rest aber, findet doch erst statt wenn der Thread es meldet, also dürfte es nicht knallen. Sprich, die ganzen Rückmeldungen vom Thread kann ich so realisieren?
Ist das korrekt, oder liege ich wieder falsch? Ich wollte unbedingt den Zugriff vom Thread aus auf die Form1 vermeiden. Wie es am Anfang bemängelt wurde.

Delphi-Quellcode:
      Threads[Index].TimeOut := SpinEditTimeout.Value; // Das ist Müll. Wird korrigiert

      Threads[Index].OnUpdateActive := UpdateLabelActiveThreads;
      Threads[Index].OnUpdateJobs := UpdateLabelJobs;
      Threads[Index].OnUpdateFertig := UpdateLabelFinished;
Sorry fürs ständige Nachfragen, so lerne ich aber (für meine Verhältnisse) recht viel dazu.
Danke noch mal fürs Unterstützen.


EDIT:
Ich habe es doch so umgebaut
Delphi-Quellcode:
constructor TURLCheckerThread.Create(UrlList: TStrings; CSection1, CSection2: TCriticalSection; OnStatus: TProc<TstringList>; ShouldStop: PBoolean; OnUpdateActive, OnUpdateJobs, OnUpdateFertig: TNotifyEvent; Timeout: Word);
begin
  inherited Create(False);
  FUrlList := UrlList;
  FCSection1 := CSection1;
  FCSection2 := CSection2;
  FOnStatus := OnStatus;
  FShouldStop := ShouldStop;
  FreeOnTerminate := True;
  FTimeOut := Timeout;
  FUpdateAktiv := OnUpdateActive;
  FUpdateJobs := OnUpdateJobs;
  FUpdateFertig := OnUpdateFertig;
end;
und beim Start
Delphi-Quellcode:
procedure TForm1.ButtonStartClick(Sender: TObject);
var
  Threads : array[0..100] of TURLCheckerThread;
  Index : Integer;
  Timeout : Word;
begin
  if Assigned(CSection1) then FreeAndNil(CSection1); {Falls ich nach Cancel noch mal Start drücke statt Weiter}
  if Assigned(CSection2) then FreeAndNil(CSection2);
  if Assigned(UrlList) then FreeAndNil(UrlList);

  UrlList := TStringList.Create;
  CSection1 := TCriticalSection.Create;
  CSection2 := TCriticalSection.Create;
  ShouldStop := False;

  for Index := 0 to 200 do
    begin
      URLList.Add('http://google.com/' + IntToStr(Index));
    end;

  LabelActiveThreads.Caption := '0';
  LabelJobs.Caption := '201';
  LabelIdle.Caption := '201';
  IdleJobs := 201;
  Gauge1.MaxValue := 201;
  Gauge1.Progress := 0;
  JobsFinished := 0;
  Timeout := SpinEditTimeout.Value * 1000;

  for Index := 1 to SpinEditThreads.Value do
    begin
      Threads[Index] := TURLCheckerThread.Create(UrlList, CSection1, CSection2,
        procedure(Msg: TstringList)
          var
            ErgebnisListe : TStringList;
          begin
            RichEditLog.Lines.Add(Msg.Text); {Ergebnis als StringList}
          end, @ShouldStop, UpdateLabelActiveThreads, UpdateLabelJobs, UpdateLabelFinished, Timeout);

     {Zähle aktive Threads}
      Inc(ActiveThreads);
      LabelActiveThreads.Caption := IntToStr(ActiveThreads);
    end;
end;

Geändert von IMPEGA (26. Mai 2025 um 21:12 Uhr)
  Mit Zitat antworten Zitat