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;