![]() |
Thread Problem - Stack overflow
Hi Jungs,
mal wieder ein Problemchen. Am besten zeig ich euch gleich den Code. Ist das erste mal das ich mit Threads arbeite (arbeiten will) aber klappt nicht so richtig:
Code:
PROCEDURE LoadPages;
VAR temp : ARRAY[0..250] of String; ThreadArray : ARRAY of CheckThread; j,count : Integer; BEGIN GetUrls(temp,count); // Speichert die Urls in das Array und gibt Array + Anzahl der Einträge zurück SetLength(ThreadArray,count-1); FOR j := 0 TO count - 1 DO BEGIN ThreadArray[j] := CheckThread.Create(True); WITH ThreadArray[j] DO BEGIN url := temp[j]; FreeOnTerminate := True; Resume; END; END; END;
Code:
unit uscs_thread;
interface uses Classes, Idhttp; type CheckThread = class(TThread) private protected procedure Execute; override; PROCEDURE SendUrl; public SID,url : String; end; implementation uses uscs_main; procedure CheckThread.Execute; var IdHttp1 : TIdHTTP; Request : TStringList; MyStream : TMemoryStream; i : integer; begin IdHttp1 := TIdHTTP.Create(nil); TRY idHttp1.RedirectMaximum := 15; idHttp1.HandleRedirects := True; Request := TStringList.Create; MyStream := TMemoryStream.Create; 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; // MyStream.SaveToFile('test.txt'); FINALLY MyStream.Free; Request.Free; END; Synchronize(SendUrl); FINALLY IdHttp1.Free; END; END; PROCEDURE CheckThread.SendUrl; BEGIN uscs_form.UpdateFromThread(url); END; end.
Code:
procedure Tuscs_form.UpdateFromThread(Furl:String);
begin IF Furl <> '' THEN uscs_result_form.LB_results.Items.Add(Furl); end; Viel Code, Hoffentlich nicht ganz so schrecklich für euch ;) Weiss nicht wo der Fehler steckt. Hoffe ihr könnt mir helfen! mfg emploi |
Re: Thread Problem - Stack overflow
ich bin zu faul, alles durchzulesen. aber zieh dir mal das rein:
Delphi-Quellcode:
SetLength(ThreadArray,count-1);
FOR j := 0 TO count - 1 DO |
Re: Thread Problem - Stack overflow
danke erstmal für die antwort!
Also ich glaube es ist kein logischer fehler drin! müsste soweit alles stimmen. Hab jetzt mal ein wenig rumgesucht im forum und hab versucht die Stack Größe vom Projekt zu erhöhen. die Frage ist halt ob das so gut ist und wie hoch man die setzen kann. Und wisst ihr wieso meine Threads so groß sind? wieviel Threads sollte so ne anwendung den maximal starten? und kann man die größe des Stapels irgendwie abfragen? damit es nicht zum overflow kommt? mfg emploi |
Re: Thread Problem - Stack overflow
Zitat:
|
Re: Thread Problem - Stack overflow
UND:
Zitat:
Nach SetLength(ThreadArray, 5); ist der höchste Index des Arrays 4 und nicht 5.
Delphi-Quellcode:
wäre richtiger.
SetLength(ThreadArray,count);
FOR j := 0 TO count - 1 DO |
Re: Thread Problem - Stack overflow
thx!
dann hätte das ja eigentlich zu ner exception führen müssen, komischerweise hab ich nie eine bekommen vielleicht weils immer stack overflow probleme gab ;) Zitat:
Also die Frage mit den maximalen Threads hast du ja schon beantwortet. und der rest? Gibt es eine elegante methode z.b. 200 aufgaben die durchzuführen sind jeweils mit nur 10 threads parallel abzuarbeiten? mfg emploi |
Re: Thread Problem - Stack overflow
ich glaube kaum. mach dir mal gedanken, ob es alles wirklich parallel sein muss. oder ob man es nicht in 25er-packs nacheinander eledigen kann.
|
Re: Thread Problem - Stack overflow
ich meinte doch 10 ner packs
bis halt alle 200 erledigt sind. aber danke erstmal werd mir mal gedanken machen. krieg das schon irgendwie hin denk ich hauptsache es funzt dann und gibt keinen stack overflow mehr! thx anyways! mfg emploi |
Re: Thread Problem - Stack overflow
Je mehr Threads erzeugt werden, desto mehr Verwaltungsaufgaben müssen geleistet werden. Außerdem wird mehr Arbeitsspeicher benötigt.
Deshalb wird iA empfohlen, Threads sehr überlegt einzusetzen: - Vorder- und Hintergrundthreads (damit das Programm mit dem Benutzer agieren kann und im Hintergrund Berechnungen ablaufen können. - auf ein Ereignis warten (wenn man auf zB mit Daten arbeitet, die sofort verarbeitet werden sollen), während man zwischenzeitlich andere Aufgaben durchführen will. Schneller geht es für Berechnungen/ Aufgaben, sie hintereinander ablaufen zu lassen, da so nicht dauerend zwischen den Threads umgeschaltet werden muss. wZ |
Re: Thread Problem - Stack overflow
Danke für die Antworten!
Ich hab mein Stack-Overflow Problem gelöst(glaub ich). Hab das Array für die URL's durch ne StringList ersetzt und jetzt gibt es damit überhaupt keine probleme mehr. Aber mal ne andere Frage. ich habe meine Execute Methode vom Thread ein wenig umgebaut um eine eventuelle Exception zu bearbeiten ist das sinnvoll so oder zu performance aufwändig?
Code:
Würd mich über ne Antwort sehr freuen!
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; Answer := 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; mfg emploi |
Re: Thread Problem - Stack overflow
Delphi-Quellcode:
procedure TForm1.SaveFile;
var IdHttp : TIdHTTP; FileStream : TMemoryStream; begin IdHTTP:= TIdHTTP.Create(nil); FileStream := TMemoryStream.Create; with IdHTTP do begin try Host:= 'www.server.com'; Port:= 80; Connect(10000); IdHTTP.Get('file.txt', FileStream); try FileStream.Savetofile('c:\file.txt'); finally FileStream.Free; end; Disconnect; except end; FreeAndNil(IdHTTP); end; end |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz