AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

BeginThread, Pointer zu Form

Ein Thema von anse · begonnen am 30. Okt 2006 · letzter Beitrag vom 1. Nov 2006
Antwort Antwort
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
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: BeginThread, Pointer zu Form

  Alt 31. Okt 2006, 07:19
Schon mal davon gehört das man auf VCL-GUI-Komponenten nur im Hauptthread der Anwendung zugreifen darfst, das die VCL nicht Thread-Save ist

Und wenn du hier auf MDI-Childfenster in Threads zugreifst kracht es halt des öfteren. Wenn schon zugriff dann nur synchronisiert. Aber dann ist vermutlich bei deinem jetzigen Programmdesign der Vorteil der Threads weg.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von anse
anse

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

Re: BeginThread, Pointer zu Form

  Alt 31. Okt 2006, 09:49
Ui, das ist ein Super-Hinweis. Vielen Dank!

Wie mache ich das ganze denn synchronisiert?
Ansgar Becker
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: BeginThread, Pointer zu Form

  Alt 31. Okt 2006, 10:01
Wenn die bei der WinAPI bleiben willst mit Hier im Forum suchenCriticalSections oder wenn du die Klasse TThread benutzen willst, mit der Methode Delphi-Referenz durchsuchenSynchronize
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von anse
anse

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

Re: BeginThread, Pointer zu Form

  Alt 1. Nov 2006, 12:14
Problem gelöst:
BeginThread erwartet keinen Pointer zu TThreadParam sondern ein echtes TThreadParam, also:

FALSCH: BeginThread(blah, Addr(tp), blah)
RICHTIG: BeginThread(blah, tp, blah)

Halleluja!
Ansgar Becker
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz