Huhu,
mal wieder ein Thread Problem nachdem ich den Stack Overflow wohl wegbekommen hab.
Ich zeig euch erstmal ein wenig Code und erläuter dann was das Problem ist:
Thread Aufruf
Unit (Ausschnitt):
Code:
PROCEDURE CurrentPage(WebBrowser1:TWebBrowser; aSID:STRING; App:TApplication);
VAR temp : TStringList;
ThreadArray : ARRAY of CheckThread;
j : Integer;
BEGIN
temp := TStringList.Create;
TRY
GetUrls(WebBrowser1,temp);
SetLength(ThreadArray,temp.Count);
counter := temp.Count; // globale Variable die die Anzahl der gestarteten Threads festhält!
FOR j := 0 TO temp.Count - 1 DO
BEGIN
ThreadArray[j] := CheckThread.Create(True);
WITH ThreadArray[j] DO
BEGIN
SID := aSID;
url := temp.Strings[j];
FIndex := j; // Indizierung der Threads
FreeOnTerminate := True;
Resume;
END;
END;
WHILE ((counter <> 0) AND (uscs_form.GetGoOn)) DO // GoOn - Abbruch Variable in der Main Form
App.ProcessMessages;
FINALLY
temp.Free;
END;
END;
PROCEDURE ThreadReady;
BEGIN
dec(counter);
END;
Thread
Unit:
Code:
procedure CheckThread.Execute;
var IdHttp1 : TIdHTTP;
Request : TStringList;
MyStream : TMemoryStream;
done : boolean;
begin
WHILE NOT(done) DO
BEGIN
IdHttp1 := TIdHTTP.Create(nil);
Request := TStringList.Create;
MyStream := TMemoryStream.Create;
TRY
done := False;
idHttp1.RedirectMaximum := 15;
idHttp1.HandleRedirects := True;
TRY
IdHttp1.Request.ContentType := 'application/x-www-form-urlencoded';
Request.Add('&PHPSESSID='+SID);
IdHttp1.Post(
url,Request,MyStream);
MyStream.WriteBuffer(#0' ', 1);
MyStream.Position := 0;
...
done := True;
EXCEPT
ON
Exception DO
done := False;
END;
IF done THEN
Synchronize(SendUrl);
FINALLY
MyStream.Free;
Request.Free;
IdHttp1.Free;
END;
END;
END;
Dazu schon mal die erste Frage, ist das günstig das so in einer While schleife zu
gestalten? Ich werd die
Exception warscheinlich dann noch spezifisch auf
den Socket Error ausrichten, aber prinzipiell soll der das halt so oft
probieren bis er es geschafft hat. ist das zu aufwendig weil er jedes
mal die objecte neu erzeugt?
Weiter Thread
Unit:
Code:
PROCEDURE CheckThread.SendUrl;
BEGIN
uscs_util.ThreadReady;
uscs_form.UpdateFromThread(inttostr(FIndex)); // soll später eigentlich etwas anderes machen
END; // übergebe zu Test Zwecken den Index
Main
Unit:
Code:
procedure Tuscs_form.UpdateFromThread(Furl:String);
begin
IF Furl <> '' THEN
uscs_result_form.LB_results.Items.Add(Furl); // Schreibt die ganzen Thread Index Nummern
end; // in eine Listbox!
das Problem ist jetzt wenn er z.b. 16 Threads startet, dann dauert es ein wenig
aber dann sind kommen nach und nach die Index Einträge in der Listbox.
natürlich nicht sortiert. das Problem ist von den 16 fehlen dann die ersten
drei! Immer auch wenn es mal nur 10 threads sind oder mehr als 16. Die ersten
drei fehlen irgendwie immer. und ich hab keine ahnung warum die nicht auch
aufgeführt werden?!
[EDIT]
also sind doch nicht immer die ersten. teilweise fehlen einfach
welche zwischendurch, komischerweise häufen sich aber auch der
1-3 thread die fehlen. muss ja dann irgendwie an der Execute
Methode des Thread liegen. weiss aber nicht wo der fehler ist
[/EDIT]
Ist das überhaupt, günstig dass über die
Code:
WHILE ((counter <> 0) AND (uscs_form.GetGoOn)) DO // GoOn - Abbruch Variable in der Main Form
App.ProcessMessages;
Schleife darauf gewartet wird, dass alle Fertig sind?
Wäre euch sehr dankbar wenn ihr mir helfen könntet!
mfg emploi