![]() |
Delphi-Version: 7
Thread startet execute nicht
Hallo zusammen,
Ich befasse mich nun seit einiger Zeit mit Delphi und habe mich nun an Multithreading probiert. Das heist ich habe mir wie in diversen Anleitungen beschrieben eine neue TCheckThread Klasse von TThread abgeleitet und sie angepasst. Über das Hauptformular rufe ich nun meinen TCheckThread in 1 bis mehreren Instanzen mit verschiedenen Parametern über TCheckThread.Create auf. Genau dort kommt es zum Problem: Der Thread beginnt nicht zu arbeiten. Hier ein paar Quellcode Ausschnitte
Code:
(Hinweis: getbestreforgeid: in dieser Prozedur wird der beste Wert zwischen Start- und Endwert ermittelt und in Fresultstring geschrieben. Am Ende wird Fthreaddone auf true gesetzt, sodass die Werte über das Hauptformular ausgelesen werden.)
[...]
type TCheckThread = class(TThread) private Fstartcountarray:unit1.tcountarray; Fendstring:string; Freforgestringarray:unit1.treforgestringarray; Fthreaddone:boolean; Fresultstring:string; Fresultpoints:integer; protected function getstatname(statid:integer):string; function calcpoints(calcablestring:string):integer; procedure getbestreforgeid; procedure execute; override; public constructor Create(startcountarray:tcountarray; endstring:string; reforgestringarray:treforgestringarray); property threaddone:boolean read Fthreaddone write Fthreaddone; property resultstring:string read Fresultstring write Fresultstring; property resultpoints:integer read Fresultpoints write Fresultpoints; end; implementation constructor TCheckThread.Create(startcountarray:tcountarray; endstring:string; reforgestringarray:treforgestringarray); var i:integer; begin inherited Create(true); Fthreaddone:=false; for i:=0 to 15 do Fstartcountarray[i]:=startcountarray[i]; Fendstring:=endstring; Fresultpoints:=0; freforgestringarray:=reforgestringarray; Freeonterminate:=false; self.Resume; end; [...] procedure TCheckThread.execute; begin form1.Memo2.Lines.Add('getbestreforgeid starting'); getbestreforgeid; end; [...] Aufgerufen wird der Thread dann in einer andren Unit:
Code:
Der gesamte TCheckThread.execute wird vom Compiler weg optimiert, Ich habe schon einiges versucht, dazu aber keine Lösung gefunden. Hat irgendjemand eine Idee dazu?
calcthread[q]:=tcheckthread.Create(countarray,endstring,reforgestringarray);
|
AW: Thread startet execute nicht
Hallo und Herzlich Willkommen in den heiligen Hallen des Wissen und des Wahnsinns (oder so ähnlich).
Erst einmal Herzlichen Glückwunsch, direkt mit der TThread-Klasse zu arbeiten und nicht direkt die WinAPI-Aufrufe zu verwenden. Ich benutze mittlerweile nur noch TThreads und finde das viel komfortabler. Jedoch:
|
AW: Thread startet execute nicht
TThread.Start gibt es erst seit Delphi 2010 ;)
|
AW: Thread startet execute nicht
Bitter, ich hätte es jetzt darauf geschoben.
Die Execute-Methode überschreibt die Methode aus TThread und erstellt wird auch ein TCheckThread-Objekt, da ist alles im Grünen. Vielleicht fliegt die Methode nach dem VCL-Zugriff komplett raus? Aber dann sollte der Debugger wenigstens eine Exception anzeigen... |
AW: Thread startet execute nicht
Zitat:
Code:
p.s. möglicherweise ist damit das Problem auch bereits behoben...
constructor TCheckThread.Create(startcountarray:tcountarray; endstring:string; reforgestringarray:treforgestringarray);
var i:integer; begin inherited Create(False); ... end; (ab Delphi 6 wird der Thread erst gestartet nachdem der Konstruktor ausgeführt wurde) |
AW: Thread startet execute nicht
Ist das Self.Resume im Konstruktor so in Ordung ?
Hier gibt es auch noch ein Tutorial wo mit Synchronize auf die Oberfläche zugegriffen wird. Sollte mit Delphi genauso laufen. ![]() Mfg Ginko |
AW: Thread startet execute nicht
Zitat:
Zitat:
Zitat:
Die jetzt erwähnten Lösungsvorschläge führen aber auch alle nicht zum gewünschten Ergebnis. Es kommt nicht dazu, dass der Thread gestartet wird. Die gesammte TCheckThread.execute wird vom Compiler weg optimiert. |
AW: Thread startet execute nicht
Zitat:
Delphi-Quellcode:
denn erreicht und ausgeführt, oder ist da auch kein blauer Punkt?
calcthread[q]:=tcheckthread.Create(countarray,endstring,reforgestringarray);
|
AW: Thread startet execute nicht
ja, das wird definitiv erreicht und ausgeführt. Habe kurz davor einen Haltepunkt gesetzt und mir den Ablauf angeschaut. Auch die constructor-Prozedur wird komplett durchlaufen, blos die execute-Prozedur wird nicht gestartet.
|
AW: Thread startet execute nicht
Zitat:
Deshalb kann diese auch eigentlich nicht wegoptimiert werden. Gründe die mir einfallen: - Der gepostete Quelltext stimmt mit dem tatsächlichen nicht überein und das "override;" wurde bei der Deklaration von "Execute" vergessen. - Die Unit gehört nicht zu dem Projekt und wird deshalb nicht mehr compiliert, statt dessen wird eine alte "*.dcu" eingebunden. Unabhängig vom aktuellen Problem sind mir die Property aufgefallen. Der Zugriff auf Variablen aus mehreren Threads muss auf jeden Fall synchronisiert werden (z.B. Get- und Setmethoden mit TCriticalSection). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz