Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Absturz nach dem 2. Aufruf einer Funktion

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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


Sehen Sie sich das Profil von Benny4 an!   Senden Sie eine Private Message an Benny4  Schreiben Sie einen Gästebucheintrag für Benny4

Beiträge: 178
Registriert: 16.02.2006

AutoCAD 2008
WIN XP Pro SP2

erstellt am: 20. Mai. 2009 15:07    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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


Sehen Sie sich das Profil von Benny4 an!   Senden Sie eine Private Message an Benny4  Schreiben Sie einen Gästebucheintrag für Benny4

Beiträge: 178
Registriert: 16.02.2006

AutoCAD 2008
WIN XP Pro SP2

erstellt am: 20. Mai. 2009 15:28    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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


Sehen Sie sich das Profil von fuchsi an!   Senden Sie eine Private Message an fuchsi  Schreiben Sie einen Gästebucheintrag für fuchsi

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 20. Mai. 2009 17:52    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Benny4 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Benny4 an!   Senden Sie eine Private Message an Benny4  Schreiben Sie einen Gästebucheintrag für Benny4

Beiträge: 178
Registriert: 16.02.2006

AutoCAD 2008
WIN XP Pro SP2

erstellt am: 20. Mai. 2009 18:07    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von fuchsi an!   Senden Sie eine Private Message an fuchsi  Schreiben Sie einen Gästebucheintrag für fuchsi

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 20. Mai. 2009 18:12    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Benny4 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von fuchsi an!   Senden Sie eine Private Message an fuchsi  Schreiben Sie einen Gästebucheintrag für fuchsi

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 20. Mai. 2009 18:14    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Benny4 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Benny4 an!   Senden Sie eine Private Message an Benny4  Schreiben Sie einen Gästebucheintrag für Benny4

Beiträge: 178
Registriert: 16.02.2006

AutoCAD 2008
WIN XP Pro SP2

erstellt am: 21. Mai. 2009 10:46    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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 = Nothing

Try
  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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz