Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Thread Problem - Stack overflow (https://www.delphipraxis.net/27650-thread-problem-stack-overflow.html)

emploi 13. Aug 2004 14:35


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

nailor 13. Aug 2004 15:33

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

emploi 16. Aug 2004 16:47

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

dizzy 16. Aug 2004 16:52

Re: Thread Problem - Stack overflow
 
Zitat:

Zitat von Delphi-OH
Erzeugen Sie nicht zu viele Threads in einer Anwendung. Der Aufwand für die Koordination mehrerer Threads kann die Systemleistung herabsetzen. Auf einem Rechner mit Einzelprozessor sind 16 Threads pro Prozess die empfohlene Obergrenze. Voraussetzung ist, dass die meisten Threads auf externe Ereignisse warten. Wenn alle Threads aktiv sind, muss die Anzahl reduziert werden.


dizzy 16. Aug 2004 16:56

Re: Thread Problem - Stack overflow
 
UND:
Zitat:

Zitat von nailor
Delphi-Quellcode:
    SetLength(ThreadArray,count-1);
    FOR j := 0 TO count - 1 DO

Das hier sollte zu einer Exception führen, deshalb sprach nailor das an :!:

Nach SetLength(ThreadArray, 5); ist der höchste Index des Arrays 4 und nicht 5.
Delphi-Quellcode:
    SetLength(ThreadArray,count);
    FOR j := 0 TO count - 1 DO
wäre richtiger.

emploi 16. Aug 2004 17:09

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:

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?
wie ist es damit?
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

nailor 16. Aug 2004 18:12

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.

emploi 16. Aug 2004 19:29

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

weißer Zwerg 17. Aug 2004 10:28

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

emploi 18. Aug 2004 15:13

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:
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;
Würd mich über ne Antwort sehr freuen!

mfg emploi


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:54 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz