Libnodave Anwendung schliessen

Snoopy123123

Level-1
Beiträge
125
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich meine Libnodave Anwendung schliesse erzeugt die Komponente jedesmal eine unschöne exception. Ich nutze Delphi und setze in meiner OnCloseQuery "nodave.active:= false;" Was muss ich nich tun damit damit keine Exception bei OnClose erzeugt wird ?!?
 
Hab leider keine Glaskugel dabei... kannst du vielleicht noch mitteilen was für eine "unschöne Exception" das ist?

Rufst du deine Komponente in einem Thread auf, was machst du sonst noch damit usw.?
 
Na ja, in der OnCloseQuery ist das nicht immer glücklich untergebracht. Man muß ja der Applikation dann auch noch die Zeit einräumen, die Verbindung zu trennen usw. Ich würde testweise mal versuchen einen Button zu nutzen, der nodave inaktiv setzt und dann die Applikation schließen. Wenn das problemlos geht, dann mal eine Wartezeit einbauen oder noch besser nachsehen, ob die Nodavekomponente irgend etwas zurück liefert, was einem anzeigt, daß sie fertig ist!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ne, bin seit Freitag wieder zurück, aber die Glaskugel hab ich daheim gelassen! :ROFLMAO:

Wie ohne Glaskugel auf die Baustelle ?! Ist ja wie en Bäcker ohne Mehl....

Ne aus der Exception Meldung denke ich kann man nicht schlau werden, hier heisst es nur exception in ***.exe aufgetreten. Ich hab mal den Assemblercode der Unterbrechungsstelle angehangen. Vielleicht kann ia jemand hier sowas lesen, ich nicht :-(

Dachte es gäbe vielleicht irgend etwas das ich in der Komponente noch abschalten muss bevor ich die Anwendung terminiere.

@Ralle:

Habe da schon meherer sekunden Zeit eingeräumt bevor endgültig geschlossen wird. Mit dem Button passiert mir das gleiche, jedoch erst wenn die Anwendung schliesse :-(
 

Anhänge

  • exception.jpg
    exception.jpg
    205,6 KB · Aufrufe: 32
Bei Delphi kenne ich mich jetzt nicht wirklich aus. Aus meiner Erfahrung mit Billisoft weiß ich, dass bei entsprechenden Terminierungs-Ergeignissen schon alle anderen Threads tot sind und somit nicht mehr reagieren können.
Was passiert eigentlich im OnClose sonst noch? Was zeigt der Debugger an, wenn weitergesteppt wird bis wieder Quellcode sichtbar ist?
 
[GLASKUGEL]
Ich denke jetzt einmal, dass du deine NoDave-Komponente in einem Thread benutzt???

Wenn das der Fall sein sollte: Erst den Thread beenden, dann die Verbindungen beenden und dann die Anwendung schließen lassen. Ich würde das auch nicht umbedingt in das OnCloseQuery reinbauen, sondern in das OnDestroy:

Code:
procedure OnDestroy(Sender: TObject);
begin
  Thread.Terminate;
  repeat
    Application.ProcessMessages;
  until Thread.Beendet;
  NoDave1.Active := FALSE;
end;

Dein Thread:

Code:
procedure TMyThread.Execute;
begin
  Beendet := FALSE;
  repeat
    DieUndDas;
  until Terminated;
  Beendet := TRUE;
end;

Und dann dürfte eigentlich nichts mehr schiefgehen! ;)

[EDIT]
Falls du noch irgendwo einen Timer hast, in dem du die Komponente auch noch drinnen hast, dann solltest du den auch vor dem Beenden der Verbindung auf Eis legen mit Enabled := FALSE!!!
[/EDIT]
[/GLASKUGEL]
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit Threads in Delphi muß man immer etwas herumprobieren. Ich hatte da so einige komische Ergebnisse, die ich mir nicht genau erklären konnte. Die Komponente selbst nutze ich nicht, aber ich meine, die macht intern einen eigenen Thread auf, um die Daten zu holen. Es wäre auch mal zu probieren, dem eigenen Thread (so vorhanden) ein Nil zuzuweisen, nach dem beenden und die Komponente vor dem schließen der Applikation komplett zu beenden, also mit Destroy oder einer ähnlichen Methode, die zur Verfügung steht. Mit solchen Exceptions hab ich auch lange gekämpft, da muß man leider wirklich ein wenig rumprobieren.
 
Die NoDave-Komponente bekommt von mir niemals mehr ein Free geben beim Beenden, irgendwie hat es mir meine Programme auch immer voll mit Fehlermeldungen, das lass ich deshalb lieber Windwos erledigen! :cool:
 
na im moment habe ich keine threads sondern nur einen timer die die nodaveread aufrufe enthält.

Beim schliessen disable ich den Timer, warte dann 1 Sekunde und setze dann die nodave.active:= false !

dann warte ich nochmal ne sekunde und dann wird die Appliaction geschlossen....

Klar terminiert Windows die Anwendung, aber das ist ja nicht im sinne des entwicklers, oder ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es ist doch ein Delphi-Beispiel bei Libnodave und er Komponente dabei oder? Dieses Beispiel bringt keine Exception beim Schließen. Vielleicht hilft es, sich mal anzusehen, wie das dort gemacht wurde.
 
dort wird auch nur
nodave.active:= false gesetzt !

Sonst ueberhaupt nichts ! Allerdings wird dort auch mit dem OnRead Ereignis der Komponente gearbeitet.
 
snoopy, Du arbeitest doch nicht in einer Garagenfirma ...

Hallo,

@snoppy123123 :

Was meinst Du wohl, warum ich damals bei unserem gemeinsamen Projekt nicht die kostenlose LibNoDave, sondern die kostenpflichtige AGLink 40 eingesetzt habe ???

In gewerblichen Projekten sollten ein paar Euro für eine professonielle Kommunikationsbibliothek wohl kein Thema sein. Oder man bezahlt in Form von Stress und unnötigem Aufwand an Zeit, Geld und Freizeit ...

Also investiere durch Deinen Arbeitgeber ein paar Euronen für eine AGLink Lizenz, Du hast in unserem Projekt doch genug Beispiele wie die Kommunikation SPS <--> PC mit Delphi ohne Probleme funktioniert. Und wenn Du dann noch Hilfe brauchst, meine email-Addy hast Du ja :s1:

Gruß

Question_mark
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

@snoppy123123 :

Was meinst Du wohl, warum ich damals bei unserem gemeinsamen Projekt nicht die kostenlose LibNoDave, sondern die kostenpflichtige AGLink 40 eingesetzt habe ???

In gewerblichen Projekten sollten ein paar Euro für eine professonielle Kommunikationsbibliothek wohl kein Thema sein. Oder man bezahlt in Form von Stress und unnötigem Aufwand an Zeit, Geld und Freizeit ...

Also investiere durch Deinen Arbeitgeber ein paar Euronen für eine AGLink Lizenz, Du hast in unserem Projekt doch genug Beispiele wie die Kommunikation SPS <--> PC mit Delphi ohne Probleme funktioniert. Und wenn Du dann noch Hilfe brauchst, meine email-Addy hast Du ja :s1:

Gruß

Question_mark


nee Fehlanzeige, das ist ne privatgeschichte und hat nichts mit der Firma zu tun. Das ganze Thema interessiert mich halt und seid unserem Project hab ich mich richtig in Delphi verliebt.

PS: Wenn das mit dem Wirtschaftsboom so weiter geht dann könnte es aber bald noch ne Garagenfirma werden :rolleyes:
 
Free von Komponenten in Delphi

Hallo,

human schrieb:
Die NoDave-Komponente bekommt von mir niemals mehr ein Free geben beim Beenden, irgendwie hat es mir meine Programme auch immer voll mit Fehlermeldungen, das lass ich deshalb lieber Windows erledigen!

Das kommt letztendlich doch darauf an, wie die NoDave Komponente erzeugt wird. Wenn Du die Komponente zur Entwurfszeit auf das Formular ziehst, wird die Komponente von diesem Formular automatisch erzeugt und auch beim Beenden (bzw. beim Destroy des Formulars) automatisch freigegeben.
Delphi führt dieses "Free" automatisch durch, da diese Komponente in diesem speziellen Falle immer durch den "Parent" (also das Formular) freigegeben wird.
Wenn Du die nochmal durch ein "Free" zerstören willst, kann es dann manchmal im Gebälk von Windows mächtig knallen.

Ein "Free" auf eine Delphi-Komponente darf nur gemacht werden, wenn diese durch deinen eigenen Programmcode dynamisch zur Laufzeit durch "Create" erzeugt wird. In diesem Fall kümmert sich Delphi nicht um die Freigabe, Du bist selber dafür verantwortlich diese Freigabe zu programmieren.

Gruß

Question_mark
 
Ein "Free" auf eine Delphi-Komponente darf nur gemacht werden, wenn diese durch deinen eigenen Programmcode dynamisch zur Laufzeit durch "Create" erzeugt wird. In diesem Fall kümmert sich Delphi nicht um die Freigabe, Du bist selber dafür verantwortlich diese Freigabe zu programmieren.

Normalerweise sollte man das auch machen, mache ich bei allen anderen Sachen auch, aber wenn ich meinen Prozess beende dann gibt das Windows auch ohne, dass ich das freigebe wieder frei! :rolleyes:
 
Ich versteh es trotzdem nicht.

Hab die Anwendung jetzt so umgeschrieben das ich mit nem Button die komponente Active:= true oder Active:= false setze.
Starte ich die Anwendung und schliesse sie ohne die Komponente Active zu setzen dann ist alles prima. Setze ich die Komponente auf Active:= true und dann wieder zurück auf false, und schliesse dann die Anwendung dann tritt eine Exception auf.

@QuestionMark
Ich habe die Komponente zur Entwurfszeit auf die Form gezogen und mache kein .free , habe aber auch schon mit destroy versucht die komponente bei on close zu entfernen und selbst dann bekomm ich die Exception.
 
Ich habe die Komponente zur Entwurfszeit auf die Form gezogen und mache kein .free , habe aber auch schon mit destroy versucht die komponente bei on close zu entfernen und selbst dann bekomm ich die Exception.

Das Destroy soll man normal nur nehmen, wenn es kein Free gibt! :rolleyes:
 
Zurück
Oben