Entwickler-Ecke

Datenbanken - IBEVENT with Firebird


Delphi_Rainer - Do 20.12.07 12:37
Titel: IBEVENT with Firebird
Hallo,

Ich arbeite mit Firebird 2.0 und mit TIBEVENT.

Die IBEVENT Komponente arbeitet local prima.

Meine Datenbankanbindung läuft in einem Thread damit bei remote Zugriffe die Anwendung nicht hängen bleibt.

Im Thread wird folgendes (alle 2 Sekunden ) ausgeführt.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
if database1.Connected then
 begin
  if IBEvents2.Registered then
   IBEvents2.Registered:=false;
 end;
 if database1.Connected then
   database1.close;
 if database1.Connected=false then
   database1.Open;
 if IBEvents2.Registered=false then
   IBEvents2.Registered:=true;


Dieses läuft für ca 1 Minute und dann stürzt meine Anwendung ab !!!

Kann mir jemand helfen warum ??

Mache ich das gleiche im Hauptthread (Anwendung) passiert das gleiche.

Moderiert von user profile iconjasocul: Delphi-Tags hinzugefügt


Mitmischer 1703 - Do 20.12.07 12:44
Titel: Re: IBEVENT with Firebird
Erstmal: Delphi-Tags!

----

//EDIT: @jaoscul: Sorry!
<-- Delphi-Codes in Tags geändert :roll: -->


jasocul - Do 20.12.07 12:54
Titel: Re: IBEVENT with Firebird
user profile iconMitmischer 1703 hat folgendes geschrieben:
Erstmal: Delphi-Codes!
Das heißt Delphi-Tags! :mahn:


Delphi_Rainer - Do 20.12.07 13:09

Ich habe doch den Sourcecode mitgeteilt !


DelphiMarkus - Do 20.12.07 13:15

Nein, sie meinten das Syntax-Highlighting, dann ist der Code besser im Browser zu lesen.


Delphi_Rainer - Do 20.12.07 13:24

Sourcecode:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
<span style="color: red">if database1.Connected then  
 begin  
  if IBEvents2.Registered then  
   IBEvents2.Registered:=false;  
 end;  
 if database1.Connected then  
   database1.close;  
 if database1.Connected=false then  
   database1.Open;  
 if IBEvents2.Registered=false then  
   IBEvents2.Registered:=true;</span><span style="color: green"></span>


Meinst du so !

Moderiert von user profile iconjasocul: Highlight- durch Delphi-Tags ersetzt


Mitmischer 1703 - Do 20.12.07 13:26

Nein, so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
if database1.Connected then  
 begin  
  if IBEvents2.Registered then  
   IBEvents2.Registered:=false;  
 end;  
 if database1.Connected then  
   database1.close;  
 if database1.Connected=false then  
   database1.Open;  
 if IBEvents2.Registered=false then  
   IBEvents2.Registered:=true;


Mit [delphi]-Tags. Schluss-Tag nicht vergessen!


Mitmischer 1703 - Do 20.12.07 13:30

Probier doch mal dein Programm in Schritten auszuführen (F7 glaub' ich).
Dann stürzt das Programm irgendwann ja ab - Die letzte Anweisung ist schuld!
Stürzt das Programm einfach so ab, oder mit Fehlermeldung?
Dann könnte ich mir eine Exception vom Typ EAcessViolation (bestimmt falsch geschrieben... :cry: ) vorstellen...


Delphi_Rainer - Do 20.12.07 13:35

Das Programm stürzt mit einer Eaccessviolation in GDS32.dll ab !


Mitmischer 1703 - Do 20.12.07 13:39

Ich hasse EAccessViolations!!!

Immer wenn ich eine hatte, hab' icb sie nie wegbekommen :cry: ...

Eine AccessViolation ist irgendsoetwas wie ein Arbeitsspeicherüberlauf:

Du musst dein Programm bremsen!


Delphi-Quelltext
1:
Application.ProcessMessages;                    


:nixweiss:
//Edit: Mist! search und delphi-Tags lassen sich nicht kombinieren... :cry:


Delphi_Rainer - Do 20.12.07 13:53

Ich habe es mir nochmal genauer angesehen. Es ist folgende Zugriffsverletzung bei 0x10024413 : Lesen von Adresse 0x0000001C

Sagt das jemand was ?


Mitmischer 1703 - Do 20.12.07 13:57

Was ist der Adresse 0x0000001C zugeordnet?

Lass das Programm mal unter dem Debugger laufen und achte auf das CPU-Fenster (zumindest unter CBuilder 6...)

:|


Delphi_Rainer - Do 20.12.07 14:06

Ich habe das Programm unter AQime5 laufen gelasen und habe folgenge
EAccessviolation bekommen : in adresse 0x0000001C ist die GDS32.dll.

Es trat ein Fehler im Thread auf : SetthreadExecutionstatoe +0227 in GDS32.DLL


Mitmischer 1703 - Do 20.12.07 14:08

:nixweiss:

Kann mal jemand helfen?


Delphi_Rainer - Do 20.12.07 14:45

Sorry !

War gerade Mittag Essen.

Kann mir jemand mit meinem Problem helfen !


Xentar - Do 20.12.07 20:57

GDS32.dll ist eien DLL von Firebird, da wirst du nicht viel machen können (es sei denn, du möchtest Firebird selber debuggen :D ).
Versuchs mal mit einer anderen / aktuelleren Firebird Version (2.0.3 oder 1.5.5).

Alternativ solltest du auch einfach mal deinen quellcode überprüfen..

Delphi-Quelltext
1:
2:
3:
4:
 if database1.Connected then
   database1.close;
 if database1.Connected=false then
   database1.Open;

Was wird das?
- Wenn Datenbank geöffnet, dann schließen
- Wenn Datenbank nicht verbunden (nach vorheriger Zeile also IMMER), dann neu verbinden.
Und das alle 2 Sekunden?! Da ist doch klar, dass der dir das irgendwann übel nimmt :D