Einzelnen Beitrag anzeigen

Benutzerbild von anse
anse

Registriert seit: 30. Okt 2006
Ort: Neuenkirchen
197 Beiträge
 
Delphi 11 Alexandria
 
#1

BeginThread, Pointer zu Form

  Alt 30. Okt 2006, 23:23
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...
Ansgar Becker
  Mit Zitat antworten Zitat