Hallo,
bin seit Stunden am Rätseln über folgendes Problem:
ich habe hier eine Objekt-Methode und eine Objekt-lose Funktion. In der Objekt-Methode (1. Block) wird BeginThread die Funktion ExecQueryThread als Pointer übergeben:
Delphi-Quellcode:
function TMDIChild.StartExecQueryThread(handler: TCompletionHandler; timeout: Cardinal; window: THandle; SQLQuery:
String): Cardinal;
var
req: Cardinal;
tp : TThreadParams;
begin
try
req := SetCompletionHandler(handler, timeout);
// set up params for QueryThread
tp := TThreadParams.Create( SQLQuery, req, self );
result := req;
BeginThread(
nil, 0, @ExecQueryThread, @
tp, 0, req);
debug(Format('
query call started for request id %d.', [req]));
finally
end;
end;
function ExecQueryThread(
tp: Pointer ): Integer;
var
qwe : ^TThreadParams;
zq : TZReadOnlyQuery;
begin
qwe :=
tp;
debug('
ExecQueryThread start!');
try
qwe.childwin.CheckConnection; <<<<<<<<< Hier knallt'
s mit AVs
except
exit;
end;
end;
Die Struktur von TThreadParam enthält eine Eigenschaft "childwin" die ein TMDIChild enthält. Im obigen Code wird so ein Objekt erstellt mit TThreadParams.Create( SQLQuery, req, self ); Wobei "self" sich auf das TMDIChild bezieht. Ein TMDIChild ist übrigens ein Fenster mit vielen Controls und Methoden.
Delphi-Quellcode:
type
TThreadParams =
class(TObject)
public
query:
string;
ticket: Cardinal;
childwin: TMDIChild;
constructor Create(
query:
string; requestid: cardinal; childwin: TMDIChild);
end;
Dieser Teil sieht eigentlich in meinen Augen ganz ok aus
Sobald ich aber in der "function ExecQueryThread" das TThreadParams-Objekt dereferenziere und dann auf das enthaltene childwin zugreife, hagelt es
Access Violations. Sporadisch klappen die Zugriffe, ich erkenne aber kein Muster bisher.
Irgendwie scheint die "childwin"-property oder das ganze TThreadParams-Objekt, in dem das childwin enthalten ist, nicht richtig dereferenziert zu werden. Oder so... Keine Ahnung. Habt ihr einen Rat?
Sorry falls ich was vergessen habe.. ich sehe schon den Wald nicht mehr...