Autor Beitrag
Shaitan
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Fr 18.04.03 15:46 
Hi,

hat einer von euch schon mal das Problem gehabt, das er bei einem selbstprogrammierten Thread (vom TThread abgeleitet) das Problem hatte das die Methode Resume nicht die MEthode Execute aufgerufen hat??? :nut:
Ich habe schon mal einen Thread PRogrammiert, da ging das aber ohne Probleme. Ich weiß nicht, was ich vergessen habe. :evil:
ICh konnte das Problem zeitweise umgehen indem ich mir eine Zeile vor dem aufrufen von Resume noch einmal mit showmessage etwas ausgegeben habe. dann hat der Thread gestartet.
Hat einer von euch eine Idee? (Ich überschreibe auch die Methode Execute mit Override)

MfG Shaiten
Andreas Pfau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: Fr 18.04.03 17:37 
Zeig mal den Code (Deklaration und Implementation vom Thread und von aufrufen).

_________________
Life is a bad adventure, but the graphic is really good!
Shaitan Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Fr 18.04.03 18:08 
ok, hier erst mal die Deklaration:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
type
  TGetPictures = class(TThread)
    IdTCPClient1: TIdTCPClient;
  private
    cv_webAdress,
    cv_Referer,
    cv_savename:string;
    cv_HTTP11:Boolean;
    cv_StatusBar: TEdit;
    cv_Fertig: Boolean;
    cv_parent: TComponent;
    Procedure getPic(WebAdress,Referer,SaveName:String);
  public
    Procedure getPicture(WebAdress,Referer,SaveName:String; HTTP11:Boolean; StatusOut:TEdit; Comp:TComponent);
    Procedure AfterConstruction; override;
    destructor Destroy; override;
    function getAnzInstanzen:Integer;
    Function istFertig:Boolean;
  protected
    procedure Execute; override;
  end;



hier die Execute Methode:

ausblenden Quelltext
1:
2:
3:
4:
Procedure TGetPictures.Execute;
begin
  getPic(cv_webAdress,cv_Referer,cv_savename);
end;


Das füllen der Klassen-Variablen (cv_....)

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Procedure TGetPictures.getPicture(WebAdress,Referer,SaveName:String;HTTP11:Boolean; StatusOut:TEdit; Comp:TComponent);
begin
  cv_webAdress := WebAdress;
  cv_Referer := Referer;
  cv_savename := SaveName;
  cv_HTTP11 := HTTP11;
  cv_StatusBar := StatusOut;
  cv_parent := comp;
end;


hier ist aufrufen der Threads, wie man sieht in einem dynamischen Array,
damit im Programm bestimmt werden kann wieviele Threads gleichzeitig laufen sollen...

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
var loadPics: array of TGetPictures;
....
      len := length(loadPics)-1;
      while (Length(loadPics) >= StrToInt(AnzInstanzen.Text)) do
      begin
        for k := len downto 0 do
        begin
          if loadPics[k].istFertig then
          begin
            loadPics[k].Free;
            if (k < length(loadPics)-1) then
              loadPics[k] := loadPics[length(loadPics)-1];
            SetLength(loadPics,length(loadPics)-1);
          end;
        end;
      end;
      if (length(loadPics) < StrToInt(AnzInstanzen.Text)) then
      begin
        SetLength(loadPics,length(loadPics)+1);
        loadPics[length(loadPics)-1] := TGetPictures.Create(True);
        with loadPics[length(loadPics)-1] do
        begin
          getPicture(datei,ref,'v'+inttostr(i)+'b'+inttostr(j)+'.jpg',webProtocolChBox.Checked, Statusbar,Form1);
          Resume;
        end;
      end;
    end;
....


Ich hoffe da versteht man wenigstens einen Teil von und mir kann einer helfen...

mfg Shaitan
Andreas Pfau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: Fr 18.04.03 19:09 
Nee, ist klar...

Also, ich weiß nicht, ob's das ist, aber du rufst eine Methode im Thread auf... Versuch mal, die Variablen public zu machen und die Variablen dann manuell zu setzen. Ich arbeite eigentlich nie mit TThread, ich mache das mit der WinAPI, daher... ich finde keinen konkreten Fehelr, sorry!

_________________
Life is a bad adventure, but the graphic is really good!
Shaitan Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Sa 19.04.03 02:06 
Hi Andreas,

ich habe meinen Fehler gefunden, naja wenn es einer war...
Durch die While-Schleife die abfragt ob der Prozess fertig ist, ist das Programm halbwegs lahmgelegt worden. Ich habe es in einem 2. Versuch in einem anderen Projekt gemerkt. Wenn da ein Applikation.ProcessMessage drin ist geht es auch irgendwann mal los...
Vielen Dank ür Deine Mühe!

PS.: Kann man mit der WinAPI CreateThread auch Nachrichten, wie z.B. bei mir ob der Prozess fertig ist (die Methode "istFertig") auch abfragen, ich kann mir das nur so halb vorstellen mit der API. Da wird doch nur die eine Funktion abgearbeitet deren Pointer übergeben wird...

oki bis dann

mfg Shaitan
Andreas Pfau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: Sa 19.04.03 09:06 
Also, mit CreateThread() rufst du egentlich nur 'ne (mit "Stdcall" deklarierte) Methode auf, die dann als Thread läuft. Mehr is das nicht.

Wenn du IstThreadFertig() machen willst, machs' so:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
// Nur prüfen, softort zurückkehren
If WaitForSingleObject(ThreadHandle, 0) = Wait_Object_0 Then
 ShowMessage('Thread ist terminated').

// Diesmal warten wir, bis der Thread WIRKLICH fertig ist
WaitForSingleObject(ThreadHandle, Infinite);
ShowMessage('Thread ist terminated').


OK, das Prob: Ich glaube, mit TThread funzt es nicht, da das Handle freigegeben wird, sobald der Thread fertig ist. Probier's halt mal. WaitForSingleObject() funzt nömlich nur, wenn das Handle noch gültig ist, und spricht an, sobald der Thread fertig ist.

_________________
Life is a bad adventure, but the graphic is really good!