![]() |
Microsoft Visual C++ Runtime Library - R6025
Ich habe heute Stunden mit einem Problem gekämpft und möchte Euch zur Info folgendes durchgeben.
Nach einer größerem Programmänderung, die ich in weitern Teilen erst mal aus dem Kopf heraus machen musste, bevor ich das erste mal wieder kompiliert habe, hatte ich dann beim Beenden vom Programm die Fehlermeldung: Zitat:
![]() Das hat mich dann dazu veranlasst meine neu erstellten Threads erst mal "abzuschalten" und Schritt für Schritt alles nacheinander wieder zu "aktivieren" um festzustellen, wo das Problem liegt. Ich habe ungefähr folgenden Code gehabt:
Delphi-Quellcode:
Beim Beenden vom Programm kam dann dieser C++ Runtime Error, der mich schier zur Verzweiflung gebracht hat.
TmyThread = class(TThread)
private FDatabase: TADODatabase; protected procedure Execute; override; public constructor Create(CreateSuspended: Boolean); destructor Destroy; override; property Database: TADODatabase read FDatabase write FDatabase; end; constructor TmyThread.Create(CreateSuspended: Boolean); begin inherited Create(CreateSuspended); end; destructor TmyThread.Destroy; begin inherited; end; procedure TmyThread.Execute; begin CoInitialize(nil); // Für ADO - muss in jedem eigenen Thread selbst gemacht werden. Unit ActiveX einbinden try while not Terminated do begin // mach irgend etwas, berechne end; finally CoUninitialize; end; end; . . . procedure TfrmMain.FormCreate(Sender: TObject); begin myThread := TmyThread.Create(True); myThread.FreeOnTerminate := True; myThread.Database := frmMain.ADODatabase; myThread.Resume; // Starte Thread und laufe einmal durch end; Das Problem ist wohl, dass mein Haupt-Thread (Formular) schon beendet ist, bevor der Thread an sich selbst beendet ist, der Thread aber noch versucht auf frmMain.ADODatabase zu zugreifen, was ein COM-Objekt ist und dadurch diesen Fehler gebracht hat. Also, wenn Ihr mal ein ähnliches Problem habt, dann könnt Ihr vielleicht in dieser Richtung suchen. Ich habe meinen Thread jetzt so umgeschrieben, dass ADODatabase im Thread selbst erzeugt und zerstört wird und bis jetzt gab es keine Probleme mehr. Grüße Sven |
Re: Microsoft Visual C++ Runtime Library - R6025
Ist klar:
Du verwendest COM-Komponenten (Hier die ADO/OLE DB-Komponenten hinter ADOExpress/dbGo) und verwendest die Interfacezeiger direkt in einen anderen Thread. Nach COM-Spielregeln ist es aber nötig Interfaces bei Verwendung in einem anderen Thread als den Thread in dem sie erzeugt wurden mit ![]() ![]() |
Re: Microsoft Visual C++ Runtime Library - R6025
Tja, wenn man es nicht weiß. Mit solchen Dingen musst ich mich bisher noch nicht befassen. Jetzt bin ich um eine Erfahrung reicher.
Danke Sven |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 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