AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread Problem - Stack overflow

Ein Thema von emploi · begonnen am 13. Aug 2004 · letzter Beitrag vom 5. Sep 2004
Antwort Antwort
Seite 1 von 2  1 2      
emploi

Registriert seit: 21. Jun 2004
Ort: Ilmtown
40 Beiträge
 
Delphi 7 Enterprise
 
#1

Thread Problem - Stack overflow

  Alt 13. Aug 2004, 15:35
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
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#2

Re: Thread Problem - Stack overflow

  Alt 13. Aug 2004, 16:33
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
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
emploi

Registriert seit: 21. Jun 2004
Ort: Ilmtown
40 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Thread Problem - Stack overflow

  Alt 16. Aug 2004, 17:47
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
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Thread Problem - Stack overflow

  Alt 16. Aug 2004, 17:52
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.
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Thread Problem - Stack overflow

  Alt 16. Aug 2004, 17:56
UND:
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.
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
emploi

Registriert seit: 21. Jun 2004
Ort: Ilmtown
40 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Thread Problem - Stack overflow

  Alt 16. Aug 2004, 18:09
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
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#7

Re: Thread Problem - Stack overflow

  Alt 16. Aug 2004, 19:12
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.
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
emploi

Registriert seit: 21. Jun 2004
Ort: Ilmtown
40 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Thread Problem - Stack overflow

  Alt 16. Aug 2004, 20:29
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
  Mit Zitat antworten Zitat
weißer Zwerg
(Gast)

n/a Beiträge
 
#9

Re: Thread Problem - Stack overflow

  Alt 17. Aug 2004, 11:28
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
  Mit Zitat antworten Zitat
emploi

Registriert seit: 21. Jun 2004
Ort: Ilmtown
40 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Thread Problem - Stack overflow

  Alt 18. Aug 2004, 16:13
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:20 Uhr.
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