| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY WIRD VON NVIDIA ZUM HÄNDLER DES JAHRES GEWÄHLT, eine Pressemitteilung
|
Autor
|
Thema: VB.NET-AddIn -> IV wird nicht beendet (2165 mal gelesen)
|
rtend12 Mitglied Dipl.-Ing. (FH) Maschinenbau / Konstrukteur
Beiträge: 436 Registriert: 21.07.2004 Catia V5 (R16SP5, B18SP5) VB.Net 2003
|
erstellt am: 20. Jun. 2006 22:43 <-- editieren / zitieren --> Unities abgeben:
Hallo, hab mal eine Frage zur Add-In-Programmierung mit VB.NET. Wenn ich mein AddIn im IV ausführe und IV dann schließe bleibt IV als Prozess weiter aktiv. Wenn ich das AddIn nicht ausführe wird IV richtig beendet. Beim Debuggen läuft die Deactivate-Routine ganz durch. Hat von euch jemand eine Idee woran das liegen könnte? Ich denke mal es liegt daran, dass irgendein Objekt im Speicher hängt. Aber wie krieg ich dieses Objekt raus. Kann man sich eine Liste aller Objekte anzeigen lassen, die gerade aktiv sind? Danke Reinhard Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570 Laptop: Alienware m17x Win7, Inventor2012
|
erstellt am: 21. Jun. 2006 11:12 <-- editieren / zitieren --> Unities abgeben: Nur für rtend12
Hallo Reinhard, ich vermute auch, dass ein Objekt hängt, weil mir das auch öfters passiert. Leider wird beim Zugriff auf Inventor Objekte der Code nicht richtig gemanagt. Ich mache meine Projekte alle in VS2005 aber nicht als Addin sondern als stand-alone. So gibt es bei mir keine Deactivate, sondern die Dispose. Da setze ich für alle Fälle alle meine Objekte auf null. Bei einem stand-alone Programm ist das alles viel schwieriger, da man den Application Event implementieren muss, und der Event gehört zum Inventor Thread. Und da .NET thread-safe ist, kann ich aus dem Event meine exe nicht beenden. Aber mit dem passenden Delegate und Invoke geht dass dann auch schon. Und ich glaube nicht, dass man sich automatisch eine Liste aller aktiven Objekte anzeigen lassen kann. Das würde aber vieles leichter machen.
------------------ Grüße daywa1k3r FX64 Software Solutions Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
BernhardU Mitglied Techniker / Konstrukteur / Student
Beiträge: 328 Registriert: 17.08.2005 Windows XP SP3 AIP 2011 VS 2005
|
erstellt am: 21. Jun. 2006 15:19 <-- editieren / zitieren --> Unities abgeben: Nur für rtend12
Hi Igor! Ich habe auch das Problem aber mit meiner stand alone Application! Ich habe auch die Applicationevents von IV eingebunden, dass wenn iv geschlossen wird, das auch mein Programm geschlossen wird! Doch iv bleibt nach dem Schließen immer im Hintergrund geöffnet! wie funktioniert das mit Zitat: Delegate und Invoke
? Oder liegt das auch an einem objekt? Vielen Dank! mfg Bernhard Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
BJ Mitglied PLM System Administrator
Beiträge: 488 Registriert: 20.12.2002 SolidEdge Inventor AutoCad --- Dell Precision M90 Win XP Prof., SP 2 2 GHz Dual Core, 2GB RAM NVIDIA Quadro FX 2500M, 512MB
|
erstellt am: 21. Jun. 2006 17:48 <-- editieren / zitieren --> Unities abgeben: Nur für rtend12
|
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570 Laptop: Alienware m17x Win7, Inventor2012
|
erstellt am: 21. Jun. 2006 20:39 <-- editieren / zitieren --> Unities abgeben: Nur für rtend12
Na ja, ein Beispiel. Stand-alone Programm instanziert ein paar Inventor Objekte, und muss dann merken, wenn Inventor geschlossen wird, um die wieder frei zu geben. Es werden die AppicationEvents implementiert, in dem Fall Application.Quit. Der Code von Application.Quit befindet sich in unserem externen Programm, jedoch wenn wir z.B. Application.ExitThread(); versuchen, würden wir eine „Thread übergreifende“ Exception bekommen, weil wir versuchen aus dem Inventor Thread auf unseren Thread zu schließen. Also ist es nötig eine Delegat Funktion zu implementieren. Könnte ganz einfach so aussehen: Code:
// Delegate private delegate void DelegateCloseApplication(); private void CloseApplication() { Application.ExitThread(); }
Und dann noch kurz die Implementierung von Inventor Application Events: Code:
private Inventor.ApplicationEvents ApplicationEvts; private Inventor.ApplicationEventsSink_OnQuitEventHandler ApplicationEvents_OnQuit;ApplicationEventsSink(); #region Application Events public Boolean ApplicationEventsSink() { try { ApplicationEvts = oApp.ApplicationEvents; ApplicationEvents_OnQuit = new Inventor.ApplicationEventsSink_OnQuitEventHandler(OnApplicationQuitEvent); ApplicationEvts.OnQuit += ApplicationEvents_OnQuit; } catch (Exception ex) { log.Log("ApplicationEventsSink: " + ex.Message, FX64Log.FX64_Log_Type.Exception); return false; } return true; } private void OnApplicationQuitEvent(Inventor.EventTimingEnum oTiming, Inventor.NameValueMap oValueMap, out Inventor.HandlingCodeEnum oHandling) { if (oTiming == Inventor.EventTimingEnum.kBefore) { try { Invoke(new DelegateCloseApplication(CloseApplication), new object[] { }); //Thread beenden mit Hilfe von der Delegate Funktion oHandling = Inventor.HandlingCodeEnum.kEventHandled; } catch (Exception ex) { log.Log("OnApplicationQuitEvent: " + ex.Message, FX64Log.FX64_Log_Type.Exception); oHandling = Inventor.HandlingCodeEnum.kEventCanceled; } } oHandling = Inventor.HandlingCodeEnum.kEventHandled; } #endregion
Und mit der Zeile: Code:
Invoke(new DelegateCloseApplication(CloseApplication), new object[] { });
erfolgt der Zugriff von einem auf das andere Thread. Delegates können ganz normal einen Rückwert und Argumente besitzen. Wegen der Einfachheit habe ich hier weder Rückgaberecht noch Argumente benutzt. Das hier ist eher nur ein Ausweg über die Delegates, jedoch gewinnen die richtig an Bedeutung, wenn man eine Multithread Anwendung schreibt und die Threads müssen die Daten austauschen. Na ja, so in etwa mache ich es, und nein ich kann es nicht in VB.NET posten Andere Vorschläge und Wege sind natürlich willkommen.
------------------ Grüße daywa1k3r FX64 Software Solutions Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rtend12 Mitglied Dipl.-Ing. (FH) Maschinenbau / Konstrukteur
Beiträge: 436 Registriert: 21.07.2004 Catia V5 (R16SP5, B18SP5) VB.Net 2003
|
erstellt am: 21. Jun. 2006 20:50 <-- editieren / zitieren --> Unities abgeben:
|
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570 Laptop: Alienware m17x Win7, Inventor2012
|
erstellt am: 21. Jun. 2006 21:00 <-- editieren / zitieren --> Unities abgeben: Nur für rtend12
|
BernhardU Mitglied Techniker / Konstrukteur / Student
Beiträge: 328 Registriert: 17.08.2005 Windows XP SP3 AIP 2011 VS 2005
|
erstellt am: 05. Jul. 2006 19:38 <-- editieren / zitieren --> Unities abgeben: Nur für rtend12
Hi! Also habe wirklich alle meine Objekte auf Nohting gesetzt wie nur irgendwie mit IV zu tun hatten und es funktioniert jetzt einwandfrei! Habe nur noch ein kleine Problem bei einem Programm, mit dem ich teile in eine Baugruppe einfüge! Und zuvor definiere ich auch noch das Application Event OnQuit! Das Event funktioniet auch ohne Probleme, doch kann ich nur einen Teil einfügen in die Baugruppen, dann funktioniert es nicht mehr! Ich werde das ganze jetzt mal debuggen! Vielen Dank nochmal!! mfg Benhard Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |