| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: CrossThreadMessagingException? WIe vermeiden? (1298 mal gelesen)
|
deian Mitglied ApplicationEngineer
Beiträge: 10 Registriert: 01.04.2009
|
erstellt am: 10. Jun. 2009 11:47 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich habe ein Problem mit Threading. Ich möchte einen Thread erstellen der alle 500ms eine Funktion ausführt die auf Autocad zugreift. Nun habe ich eine .net Dll erstellt, die wenn sie in AutoCAD geladen wird diesen Thread startet. Wenn der Thread nun auf den AutoCAD Objekten operieren soll (d.h. ich verwende z.B. Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor) dann wird eine CrossThreadMessagingException geworfen. Gibt es eine Möglichkeit diese zu vermeiden, und wenn nicht, gibt es eine andere Möglichkeit zyklisch eine Funktion aufzurufen? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 10. Jun. 2009 11:53 <-- editieren / zitieren -->
Hi, AutoCAD ist nicht MultiThreading-Save. Soll heissen Du kannst zwar in Deinem Programm SubThreads starten, aber diese können nicht auf die Datenbank hingreifen (zumindest nicht in der gleichen Database). Ich nehme an, dass das Grund für die Fehlermeldung ist, mehr kann ich ohne Code nicht sagen. Vielleicht gibst noch Info, was Du machen willst, dann könnten Ideen zustandekommen, die ev. ohne MultiThreading durchkommen? Da wäre z.B. die Möglichkeit, sich an Events zu hängen wie 'CommandEnded' oder 'Beginsave' oder ... Ich hätte auch große Bedenken bei der Zeiteinstellung mit 500ms, denn ich nehme schon mal an, dass alleine das Sichern mehr als 1/2 Sekunde dauert, oder der User vielleicht mitten in einem Befehl drinsteht, all das muß abgefangen werden oder endet in Crash. - alfred - ------------------ www.hollaus.at |
deian Mitglied ApplicationEngineer
Beiträge: 10 Registriert: 01.04.2009
|
erstellt am: 10. Jun. 2009 11:58 <-- editieren / zitieren --> Unities abgeben:
Hi, also um es genauer zu sagen: Ich möchte darauf warten, dass eine Datei (an einer vorher definierten Stelle) auftaucht/erzeugt wird. In dieser Datei steht dann eine id für ein Objekt in meiner Autocad Zeichnung. Dieses Objekt soll dann herangezoomt und selektiert werden. Den Thread brauche ich um auf diese Datei zu warten und dann die entsprechenden Aktionen durchzuführen. Und genau da liegt das Problem Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 10. Jun. 2009 12:03 <-- editieren / zitieren -->
Hi, und welches Programm (das offensichtlich asynchron laufen soll) weiss, welche AutoCAD-Zeichnung Du offen hast? Oder wo bekommt es die ID her (passend zu der geöffneten DWG)? Was passiert, wenn der User die Zeichnung schliesst? Was passiert, wenn der User das Element mit der ID inzwischen gelöscht hat? Und schon aus diesen Fragen ergibt sich: wieso läuft es asynchron? Ist doch nur eine höchstgefährliche Angelegenheit (in Bezug auf Stabilität und Fehleranfälligkeit)! - alfred - ------------------ www.hollaus.at |
deian Mitglied ApplicationEngineer
Beiträge: 10 Registriert: 01.04.2009
|
erstellt am: 10. Jun. 2009 12:17 <-- editieren / zitieren --> Unities abgeben:
Dass das Programm asynchron laufen soll ist eine feste Vorgabe und leider nicht verhandelbar. Dass dies eine sehr Fehleranfällige Methode ist, ist mir bewusst, nur kann ich daran leider nichts ändern. Die id wird von Außen festgelegt und den Objekten zugewiesen. Ich bin mittlerweile nicht mal mehr sicher, ob mit diesen Vorgaben überhaupt noch eine Lösung möglich ist. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 10. Jun. 2009 12:21 <-- editieren / zitieren -->
Hi, kannst Du trotzdem versuchen, mal die Anwendung zu beschreiben, was diese Programme (einmal das in AutoCAD und dann das externe EXE) eigentlich tun und wie diese voneinander abhängig sind (in bezug auf Zeichnung, Elemente darin, ...). Es gibt vielleicht Ideen, die das Multithreading umgehen können, nur fehlen mir da die Informationen des (gedachten) Workflows. - alfred - ------------------ www.hollaus.at |
deian Mitglied ApplicationEngineer
Beiträge: 10 Registriert: 01.04.2009
|
erstellt am: 10. Jun. 2009 12:29 <-- editieren / zitieren --> Unities abgeben:
Theoretisch ist zur Erfüllung des Programmzwecks keine externe EXE nötig. Es wird lediglich eine Datei geschrieben, die z.B. Handles enthält, die die Autocad Objekte in der aktuellen Zeichnung eindeutig bestimmen. Das andere Programm weiß also welche Handles es gibt. Das Autocad-Plugin nimmt sich dann diese Datei, liest sie aus und führt den Zoom aus und selektiert das Objekt. Das iste eigentlich schon alles. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 10. Jun. 2009 13:03 <-- editieren / zitieren -->
Zitat: Es wird lediglich eine Datei geschrieben, die z.B. Handles enthält, die die Autocad Objekte in der aktuellen Zeichnung eindeutig bestimmen. Das andere Programm weiß also welche Handles es gibt
...wann wird diese Datei geschrieben, beim Öffnen der Zeichnung oder nach jedem Bearbeitungsbefehl (damit die Liste der noch vorhandenen Handles wirklich aktuell ist)? Und das externe EXE rückt irgendwann mal mit einer Datei heraus und dann soll plötzlich gezoomt werden? Mitten während der AutoCAD-Anwender vielleicht ganz wo anders arbeitet? Oder ist es so, dass Du einen Befehl startest, dieser ruft die externe EXE auf und wartet dann, bis das EXE seine Ausgabedatei erzeugt - UND IN DIESER ZEIT MUSS DER ANWENDER SOWIESO WARTEN? (Dann ist aber nix mit MultiThreading-Notwendigkeit). - alfred - ------------------ www.hollaus.at |
deian Mitglied ApplicationEngineer
Beiträge: 10 Registriert: 01.04.2009
|
erstellt am: 01. Jul. 2009 11:01 <-- editieren / zitieren --> Unities abgeben:
Hi, ich konnte leider keiner wirliche Lösung für das Problem finden. Jedoch habe ich herausgefunden, dass ich über das COM-Objekt (das ich mir auch in dem Thread holen kann) die gewünschten aktionen ausführen kann. Damit ist das Problem behoben Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |