Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - TThread -> Methode Resume funktioniert nicht
Shaitan - Fr 18.04.03 15:46
Titel: TThread -> Methode Resume funktioniert nicht
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 - Fr 18.04.03 17:37
Zeig mal den Code (Deklaration und Implementation vom Thread und von aufrufen).
Shaitan - Fr 18.04.03 18:08
ok, hier erst mal die Deklaration:
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:
Quelltext
1: 2: 3: 4:
| Procedure TGetPictures.Execute; begin getPic(cv_webAdress,cv_Referer,cv_savename); end; |
Das füllen der Klassen-Variablen (cv_....)
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...
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 - 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!
Shaitan - 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 - 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:
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!