Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  CrossThreadMessagingException? WIe vermeiden?

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:  CrossThreadMessagingException? WIe vermeiden? (1297 mal gelesen)
deian
Mitglied
ApplicationEngineer


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

Beiträge: 10
Registriert: 01.04.2009

erstellt am: 10. Jun. 2009 11:47    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 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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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


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

Beiträge: 10
Registriert: 01.04.2009

erstellt am: 10. Jun. 2009 11:58    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,

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

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


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

Beiträge: 10
Registriert: 01.04.2009

erstellt am: 10. Jun. 2009 12:17    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

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

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


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

Beiträge: 10
Registriert: 01.04.2009

erstellt am: 10. Jun. 2009 12:29    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

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

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


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

Beiträge: 10
Registriert: 01.04.2009

erstellt am: 01. Jul. 2009 11:01    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 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

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