| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Absturz nach dem 2. Aufruf einer Funktion (711 mal gelesen)
|
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 20. Mai. 2009 15:07 <-- editieren / zitieren --> Unities abgeben:
Hallo, arbeite mit VB.NET. Meine Frage: Ich habe eine Funktion geschrieben, die die vom Benutzer gewählten Objekte (Linie, Kreise, Splines) nach bestimmten Kriterien dreht und verschiebt. Das klappt auch sehr gut, wenn ich diese Funktion das 1. mal aufrufe. Beim neuerlichen Aufrufen der Funktion stürzt AutoCAD ab. Habe jede Transaction nach Gebrauch wieder geschlossen. Woran können diese Abstürze liegen? Kann ich vor dem Beginnen der eigentlichen Arbeit der Funktion alles "resetieren" damit alles wieder bei 0 startet? Vielen Dank schon mal für Eure Ratschläge.
------------------ Grüsse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 20. Mai. 2009 15:11 <-- editieren / zitieren -->
Hi, ohne Fehlermeldung ==> keine Chance für eine Antwort Ein allgemeines 'Reset' gibt es nicht, darum musst Du dich kümmern. Ich hätte mal im Debug-Mode gestartet, dann steht er beim Abflug dort im Codefenster, wo der Fehler auftritt (i.d.R. ) - alfred - ------------------ www.hollaus.at |
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 20. Mai. 2009 15:28 <-- editieren / zitieren --> Unities abgeben:
Hallo, das hab ich schon gemacht. Das AutoCAD stürzt mit der Meldung: SYSTEMFEHLER: "Unhandled Access Violation Reading 0x0000 Exception at d35629bh" ab ohne irgend eine Zeile anzuzeigen wo was faul ist. ------------------ Grüsse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 20. Mai. 2009 15:52 <-- editieren / zitieren -->
dann ist ein Element, das Du zuvor zum Schreiben geöffnet hattest, nicht ordnungsgemäß beendet. Also ist die Aussage 'alle Transactions' sind beendet soweit zu verifizieren, dass diese 'an den richtigen Stellen' behandelt werden (also auch wenn Du mitten im Code in eine 'catch Ex as exception' hineinfliegst). Auch probieren/verifizieren (der Fehler würde sich aber geringfügig anders zeigen) würde ich 'DocumentLock'. Sorry, sonst kann ich nix mehr machen als Hinweise - alfred - ------------------ www.hollaus.at |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 20. Mai. 2009 17:52 <-- editieren / zitieren --> Unities abgeben: Nur für Benny4
Hm, was heistt alle Transactions beendet ? Im Normalfall benötigt man genau eine Transaction. Verschachtelst Du vielleicht Transactions ?? Beendest Du eh nicht den Transactionsmanager des Dokuments anstatt die gestartete Transaction? Das fällt mir dazu ein, weils auch meine fehler waren Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 20. Mai. 2009 18:07 <-- editieren / zitieren --> Unities abgeben:
Hi, ich beende sicher nur Transactions. Ich habe verschiedene Funktionen, eine die meine Objekte dreht, die andere die sie verschiebt u.s.w. Und bei allen starte ich eine eigene Transaction, stelle aber sicher, dass eine eventuelle vorherige Transaction beendet wurde. Sollte ich das besser unterlassen? Würdest du die Transaction als globale Variable deklarieren und in allen Funktionen verwenden? ------------------ Grüsse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 20. Mai. 2009 18:12 <-- editieren / zitieren --> Unities abgeben: Nur für Benny4
poste doch mal den Code. Ich jedenfalls versuche immer nur mit einer Transaction auszukommen. Gerade in diesem Fall, dem Objekt (Objekten) einen neuen Einfügepunkt/Drehung zuzuweisen, kann eine Transaction sein. Die Berrechnung der Einfügepunkte/Drehungen usw. kann in Unterfunktionen passieren. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 20. Mai. 2009 18:14 <-- editieren / zitieren --> Unities abgeben: Nur für Benny4
Zitat: Original erstellt von Benny4: Hi,ich beende sicher nur Transactions. Ich habe verschiedene Funktionen, eine die meine Objekte dreht, die andere die sie verschiebt u.s.w. Und bei allen starte ich eine eigene Transaction, stelle aber sicher, dass eine eventuelle vorherige Transaction beendet wurde
diese Aussage macht mich doch etwas stutzig. Wo und wie stellt Du fest das einen eventuell vorige Transaction beendet wurde? Im Ctach teil der vorigen Funktion, oder im Beginn der nächsten Funktion? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 21. Mai. 2009 10:46 <-- editieren / zitieren --> Unities abgeben:
Hi, vor ich die Funktion "drehen" oder "verschieben" aufrufe, "zerstöre" ich die aktuelle Transaction. Das Problem, dass beim 2. Aufruf der Funktion ACAD abstürzt habe ich beheben können. Ich habe die Transaction im Catch - Block und nicht im Finally-Block beendet. Allerdings kackt AutoCAD immer am Ende ab, wenn ich ACAD schließe. Das ist jetzt im Moment nicht so schlimm aber halt nicht ganz ok... ------------------ Grüsse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 21. Mai. 2009 13:17 <-- editieren / zitieren -->
Hi, Zitat: Ich habe die Transaction im Catch - Block und nicht im Finally-Block beendet
...na da haben wir den Übeltäter ja auch schon ;) ...denn wenn er nicht in das 'Catch' hineinkommt (und das sollte er ja in der Regel nicht), dann wird die TransAction nicht ordnungsgemäß geschlossen und als weitere Folge werden die Entities auch nicht korrekt abgeschlossen. Zitat: Allerdings kackt AutoCAD immer am Ende ab
...sowas bitte nie ignorieren, Code der schon beim Design solche Auswirkungen erzeugt, macht beim Anwender dann noch mehr Blödsinn, mit Sicherheit ...und die Freude des Anwenders sinkt, das magst Du nicht wirklich. Die Methode, die ich für richtig halte (subjektives Empfinden): Code: Dim tTrAct As DatabaseServices.Transaction = NothingTry tTrAct = tAcadDoc.TransactionManager.StartTransaction '....und da jetzt Deine Aktionen 'und wenn der Code bis hierher kommt, dann ist offensichtlich alles fehlerfrei gelaufen 'also können wir hier die Aktionen bestätigen tTrAct.Commit Catch ex As Exception 'wenn er hierher kommt, mach ich kein 'Commit', weil ich ja nicht abschätzen kann, wieviel richtig ist Debug.Print(ex.Message.ToString) Finally 'und hier beenden wir die TransAction, denn hier muss der Code jedenfalls vorbei If tTrAct IsNot Nothing Then tTrAct.Dispose() : tTrAct = Nothing End Try
...und wenn das Document auch noch gelockt werden muss, dann locken vor Öffnen der TransAction und Dispose nach tTrAct.Dispose auf gleiche Vorgehensweise. - alfred - ------------------ www.hollaus.at |