Einzelnen Beitrag anzeigen

emploi

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

Nicht alle Threads werden bearbeitet?! ...

  Alt 20. Aug 2004, 13:41
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
  Mit Zitat antworten Zitat