| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY bietet das umfangreichste Ökosystem von B2B als auch B2C-Lösungen für IT-Akteure auf dem Markt, eine Pressemitteilung
|
Autor
|
Thema: Backgroundworker installation (1714 / mal gelesen)
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009
|
erstellt am: 13. Dez. 2016 11:22 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ich hätte mal eine Frage, wie man mit .net die Statusleiste (Dieselbar) in Autocad anspricht. Mir ist bekannt wie man den Backgroundworker von System.Windows.Forms installiert, damit ich mir bspw. den Prozess im Dialogfenster anzeigen lassen kann. Ich möchte bevor der Dialog wie im Bild angezeigt wird, Zeichnungen auswählen können. Der Prozess des Ladens kann mitweilen sehr viel Zeit in Anspruch nehmen. Damit der Anwender nichts "unüberlegtes" tut, soll der Prozesstatus in der Menuleiste angezeigt werden. ------------------ Gruss Dirk Blog | Adolf Spende | Infra-Feed | ÅF AB
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 13. Dez. 2016 11:39 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009
|
erstellt am: 13. Dez. 2016 12:37 <-- editieren / zitieren --> Unities abgeben:
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 24. Aug. 2017 20:32 <-- editieren / zitieren --> Unities abgeben:
Kurz mal nachgefragt: Wenn ich kleiner Prozesse habe, läuft die Prozessanzeige, aber nicht wenn der zuviele Objekte erzeugt werden. Ist die Umsetzung so korrekt? Code: ProgressMeter pm = new ProgressMeter(); pm.Start("Running..."); pm.SetLimit(100); for (int i = 0; i <= 100; i++) { System.Threading.Thread.Sleep(5); pm.MeterProgress(); if (o1 != null) { //Application.DoEvents(); ??? Hier wird der Befehl zur Erzeugung von Objekten in die Zeichendatenbank ausgeführt - kann man das so machen ??? o2.CorridorFeatureLinesTo3dPoyline(o2.Corridor); App_Sampleline.Extensions.DrawPointOnSampleLineIntersection(o1.Alignment, o2.curvIds); o1 = null; } } pm.Stop(); pm.Dispose();
------------------ Gruss Dirk Blog
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 24. Aug. 2017 22:01 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Grundsätzlich richtig. AutoCAD gibt bei rechenintensiven Prozessen oftmals kine Rückmeldung. Auf die Aktualisierung der UI (ProgressMeter) hat man keinen Einfluss. Daher nehme ich für die Statusanzeige einen eigenen Dialog, der in einem parallen Thread ausgeführt wird. Den kann ich dann aktuell halten, die Anzeige/Status aktualisieren, wie ich will. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009
|
erstellt am: 25. Aug. 2017 10:27 <-- editieren / zitieren --> Unities abgeben:
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 26. Aug. 2017 14:39 <-- editieren / zitieren --> Unities abgeben:
Nimmt man einen Dialog für die Prozessanzeige habe ich das folgendermassen hier als BeispielSollte eigentlich funktionieren, wenn ich in die backgroundWorker_DoWork(object sender, DoWorkEventArgs e) noch die Befehlausführung integriere! Wenn ich mal angenommen 10 000 Objekte rot zeichnen will und das mittels o.g. Prozessmethode anzeigen lassen will, dann müsste in doWork() 10 000 als 100% deklariert werden und als Ergebnis 1% 10 Objekten entsprechen. Ist das so korrekt ausgeführt? ------------------ Gruss Dirk Blog
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009
|
erstellt am: 26. Aug. 2017 18:01 <-- editieren / zitieren --> Unities abgeben:
Fast wie vermutet stellt sich hier ein Problem. Wenn ich in meinem Beispiel ExecuteCommand() aufrufe kommt es zu einem Konflikt Code: Attempted to read or write protected memory. This is often an indication that other memory is corrupt
Es sind hier zwei Prozesse am Laufen, einmal die Befehlsausführung, die parallel mit der Prozessanzeige laufen muss. Sind wir da beim Thema asynchrone Programmierung? ------------------ Gruss Dirk Blog
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 26. Aug. 2017 22:54 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
asynchron ist was anderes, beim Variablen-/ Speicherhandling aber ähnlich. Da kannst du einen Prozess starten, und weitern Code ausführen. Irgendwann kommt dann ein await, da wartet dann der Code auf das Ende des zuvor gestarteten asynchronen Code. Du bist beim Thema MultiThreading. Im einfachsten Fall deklarierst du die Variablen, die du in mehreren Prozessen brauchst als volatile. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009
|
erstellt am: 27. Aug. 2017 11:42 <-- editieren / zitieren --> Unities abgeben:
MultiThreading oder TaskParellelLibrary , hab mal davon gehört, dass Autocad auf grund Entwicklung aus den 80ern 1-threading zulässt. Kann das Einschränkungen für AppEntwicklung bedeuten? Nach meiner bisherigen Vorgehensweise läuft die Prozessanzeige zuerst und anschliessend wird der Befehl ausgeführt. Spricht der Befehl grosse Prozessorleistung an, dann friert die Dialoganzeige mit der ProgressBar erstmal ein. Lässt sich das mit deinem Vorschlag vermeiden? ------------------ Gruss Dirk Blog
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 27. Aug. 2017 12:59 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
... das hat nichts damit zu tun, was AutoCAD da intern veranstaltet. Um sich davon unabhängig zu machen, erzeugt man ja einen eigenen, neuen Thread. Der läuft dann in einem anderen Speicherbereich wie das AutoCAD und dein von dort gestarteter Programmcode - damit auch unabhängig von der Auslastung des Prozessors durch deine Anwendung. Du musst lediglich sicherstellen, dass zwischen diesen vollkommen getrennten Speicherbereichen kommuniziert/ zugegriffen werden kann. Das geht entweder über volatile deklarierte Variablen oder über öffentlich zugängliche Methoden - keinesfalls aber direkt. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009
|
erstellt am: 28. Aug. 2017 20:12 <-- editieren / zitieren --> Unities abgeben:
Noch unklar? Ich habe einen Task oder Thread so genau sicher bin ich mir da nicht für: 1) Select Objects 2) DoWork (hier gibt es zwei Arten von Arbeit - Lese und Schreibe Daten in die Zeichnung) 3) ProgressBar anzeige funktioniert mit den BackgroundWorker object backgroundWorker_DoWork, backgroundWorker_ProgressChanged, backgroundWorker_RunWorkerCompleted zu 1) wähle ich Objekte aus zu 2) Danach sollte die ProgressBar anfangen zu arbeiten, damit der Progressbalken angezeigt wird (0%) bevor die DoWork() methode startet. zu 3) Macht mir der BackgroundWorker etwa Probleme (in dieser Anordnung) Was sind volatile Variablen (sind die Autocad spezifisch oder in .net verankert) ? ------------------ Gruss Dirk Blog
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 22275 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 28. Aug. 2017 22:58 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009
|
erstellt am: 31. Aug. 2017 08:11 <-- editieren / zitieren --> Unities abgeben:
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 01. Sep. 2017 08:59 <-- editieren / zitieren --> Unities abgeben:
Ich muss wiedermal sagen, einfach nur genial und echt super eure Hilfestellungen hier. Eine ganz neue Erfahrung, die es mir nun ermöglicht mehrere Processe gleichzeitig in Autocad laufen zu lassen. Danke Holger für den Anstoss mit Thread und danke Sebstian mit den Link dazu - es war nur noch wenig Schweissarbeit, da der Kode noch umgestellt werden musste So wie Holger meinte: Zitat: Das geht entweder über volatile deklarierte Variablen oder über öffentlich zugängliche Methoden - keinesfalls aber direkt
Code: Thread worker = new Thread(corr.DoWork); worker.Start();
Mein Test verlief jetzt so, dass ich den Befehl ausführen konnte und während er im Hintergrund arbeitet, normal in Autocad weiterarbeiten konnte. Das will ich zwar nicht, sondern anstelle eine Progressanzeige starten. Lässt sich der Thread irgendie längenmässig messen, dann wäre es einfach den status an ProgressBar zu übergebn ?
Code: while (!workerThread.IsAlive)
gibt doch nur true zurück ? Ansonsten kann die Progressanzeige nur "zählen", wenn true zurück kommt, also keine Prozenanzeige ? ------------------ Gruss Dirk Blog
[Diese Nachricht wurde von cadplayer am 01. Sep. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |