Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Thread-Problem AccessViolation-Exception (https://www.delphipraxis.net/41841-thread-problem-accessviolation-exception.html)

Gambit 9. Mär 2005 14:44


Thread-Problem AccessViolation-Exception
 
Hallo,

ich möchte eine Connection zu einer DB in einem Thread realisieren:

Delphi-Quellcode:
procedure TConnectThread.Execute;
begin
  Connect;
  if Terminated then exit;
end;

procedure TConnectThread.Connect;
begin
  DB_DataModul.createCon(Con, Database, Host, Protocol, User, Password, Port);
  terminate;
end;
Führe ich das so aus, bekomme ich eine AccessViolation Exception. Verwende ich Synchronize also

Delphi-Quellcode:
Synchronize(Connect);
wird es zwar ausgeführt aber das Programm friert während der Ausführung des Threads ein.

Was tun

fragt

Gambit

SubData 9. Mär 2005 14:45

Re: Thread-Problem AccessViolation-Exception
 
Ich hab in meiner Anwendung für solche Sachen ne TCriticalSection verwendet, damit die Datenbankabfragen nicht kollidieren... :)

Gambit 9. Mär 2005 14:48

Re: Thread-Problem AccessViolation-Exception
 
könntest du mir etaws genauer schildern, wie du das implementiert hast?

Luckie 9. Mär 2005 14:49

Re: Thread-Problem AccessViolation-Exception
 
Zitat:

Zitat von Gambit
Verwende ich Synchronize also

Delphi-Quellcode:
Synchronize(Connect);
wird es zwar ausgeführt aber das Programm friert während der Ausführung des Threads ein.

Logisch, da die Synchronize Methode im Kontext des Hauptthreads ausgeführt wird.

Gambit 9. Mär 2005 14:57

Re: Thread-Problem AccessViolation-Exception
 
Danke Luckie!
Würde es dir sehr viel ausmachen, mir noch einen Tipp zu geben, wie ich weiter vorgehen sollte?
Wär lieb...

jfheins 9. Mär 2005 14:57

Re: Thread-Problem AccessViolation-Exception
 
Du müsstest dann schon diese Datenbank-Kompo als Threadeigenschaft haben, dann kannst du mit ihr ohne Probleme arbeiten, und anschleißend musst du dann diese Thread-Kompo im Hauptprogramm speichern.

Du könntest dann entweder eine Kompo davobn ableiten und en Savetostream implementieren (falls die kompo das nicht hat) und so die komponentendaten aus dem thread in dein hauptprog schleusen, oder aber du gibst den thread nach der bendigung nicht frei, und kannst dann über MyThread.Datenbank.Close; darauf zugreifen.

Was auch ginge: Der Thread erzeugt das Datenbankobjekt, arbeitet damit, gibt den Zeiger dem Hauptprogramm weiter und gibt dann bei der beendigung das DB-Objekt aber nicht wieder frei ... (glaub' ich das beste ...)

Gambit 9. Mär 2005 17:16

Re: Thread-Problem AccessViolation-Exception
 
ich glaube das is nix für mich...jetzt hatte ich es mit TCriticalSection probiert und es ging dann tatsächlich ne ganze Zeit aber jetzt gehts auf einmal nicht mehr!!?? Wie kann das denn sein?

Edit:

Habe rausgefunden, dass es geht solange mein Laptop(als Datenbankserver) nicht angeschlossen ist. Dann läuft der Thread jetzt bis zum Connection-TimeOut.

Schließe ich das Lappi(ein Verbindungsaufbau wäre also möglich) an, bekomme ich dann wieder meine AccessViolation. Das raff ich jetzt nicht mehr...

//Edit

lume96 9. Mär 2005 17:35

Re: Thread-Problem AccessViolation-Exception
 
Moin,

Bei meinem letzten Projekt (Firebird Embedded und Zeos) erstelle ich alle DB-Kompos zur Laufzeit im Thread. Bei 20 threads sind das dann 21 Verbindungen zur DB (20 Threads plus Hauptprogramm) aber bis jetzt läuft das ganz gut. Finde auch einfacher dann mit Transaktionen zu arbeiten; braucht man sich über die Synchro keine Gedanken zu machen.

Tschüss,
Lutz


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:17 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