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.