| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für NX | | | | Solid Edge 2025 First Look Online-Event 14.11.2025, eine Pressemitteilung
|
Autor
|
Thema: Main Thread Probleme beim asynchronen Ausführen von NXOpen Programmen (797 / mal gelesen)
|
nxdev Mitglied Softwareentwickler
Beiträge: 5 Registriert: 15.03.2024
|
erstellt am: 15. Mrz. 2024 14:22 <-- editieren / zitieren --> Unities abgeben:
Hallo Zusammen, ich möchte aus meiner WindowsForms Applikation ein NXOpen Programm asynchron ausführen um das User Interface reaktiv zu halten. Nur leider treten gelegentliche main thread Fehler auf. Daher meine Frage, ob das überhaupt umsetzbar ist und wenn ja was ich falsch mache? private async Task<int> DoWorkAsync() { int returnValue = 1; try { string consoleOutput = string.Empty; await Task.Run(() => { // hier wird mein NXOpen Programm ausgeführt var result = ExecuteShellCommand(); consoleOutput = result.Result.Output; }); } catch (Exception ex) { returnValue = 0; Console.WriteLine(ex.Message; } return returnValue; } } Error Message: Call back not set. (null) has made an NX Open call while not on the main thread. The automation program should be re-worked to make NXOpen calls in the main thread. [Diese Nachricht wurde von nxdev am 15. Mrz. 2024 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2704 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-2306 3D Printer Prusa MK2 S
|
erstellt am: 15. Mrz. 2024 17:37 <-- editieren / zitieren --> Unities abgeben: Nur für nxdev
Hallo nxdev, die Meldung besagt ganz einfach, daß NX kein Multithreading mag. Alles, was über die Session oder UFSession läuft, darf nur in dem Thread aufgerufen werden, der auch die Instanz der jeweiligen (UF)Session enthält. Alle anderen Berechnungen können in separaten Threads laufen, das ist kein Problem. Der Fehler tritt m.E. immer auf, nicht nur gelegentlich. Im einfachen Fall gibt's eine Warnung im ListingWindow und/oder im Logfile, ansonsten nimmt NX auch mal gern den QuickExit. Einfachster Weg: Die NX-Session aus der WindowsForm starten, d.h. ExecuteShellCommand sollte ein Code: Dim s as Session = Session.GetSession()
enthalten und ausschlieslich darüber die Calls absetzen. Aber - was willst du damit erreichen, was heisst UI reaktiv halten ? Ein Refresh auf das Grafik-Fenster ? Dafür würde ich die Window API empfehlen, da muss man sich nicht um das Thema Multithreading kümmern. Da ist NX nur ein Fenster, wie alle anderen auch. Oder du versuchst, per Remote-Verbindung auf ein laufende Session zuzugreifen. Da ist es kein Thema, von wo und von welchen Thread der NXOpen Call kommt. Gruß, Michael
------------------ Ein Mensch wird laut, wenn er was will; wenn er's erst hat, dann wird er still; Das "Danke" ist, nach alter Sitte, Weit selt'ner als das "Bitte, Bitte". Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nxdev Mitglied Softwareentwickler
Beiträge: 5 Registriert: 15.03.2024
|
erstellt am: 18. Mrz. 2024 08:05 <-- editieren / zitieren --> Unities abgeben:
Hallo Michael, danke für die schnelle Rückmeldung. Die ExectueShellCommand ruft mein NXOpen Programm im Batch Modus auf. Das Programm enthält auch die von dir genannte GetSession Methode. Das User Interface löst lediglich nur den Trigger aus, um die Abarbeitung des Programmes durchzuführen. Nach der Beendigung meines NX Programmes wird falls nötig aus dem User Interface erneut das Programm aufgerufen und ausgeführt (Schleife). Mit reaktiv meinte ich eigentlich das verhindern des Einfrierens vom User Interface während das NX Programm ausgeführt wird. Aus deiner Antwort nehme ich aber mit, dass das asynchrone Aufrufen des NX Programms nicht die Meldung auslösen sollte, da das Ausführen eigentlich im Background Thread läuft, aber danach das Programm im eigenen Thread ist und somit keine Gefahr darstellt ? Ich mein die Meldung hat mich nur ein wenig irritiert, da ich ja weiß das NX kein Multithreading erlaubt. Funktionieren tut es ja, aber einige Male habe ich diese Meldung eben gelesen. Ob es das Programm zum Absturz gebracht hat, kann ich nicht sagen. Viele Grüße Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2704 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-2306 3D Printer Prusa MK2 S
|
erstellt am: 18. Mrz. 2024 17:34 <-- editieren / zitieren --> Unities abgeben: Nur für nxdev
Zitat: Original erstellt von nxdev:
Mit reaktiv meinte ich eigentlich das verhindern des Einfrierens vom User Interface während das NX Programm ausgeführt wird.
Falls mit User Interface die WinForm gemeint ist, hilft evtl. schon ein Application.DoEvents(). Zitat:
Aus deiner Antwort nehme ich aber mit, dass das asynchrone Aufrufen des NX Programms nicht die Meldung auslösen sollte, da das Ausführen eigentlich im Background Thread läuft, aber danach das Programm im eigenen Thread ist und somit keine Gefahr darstellt ?
Startest du die Methode, die NX ausführt ( private async Task<int> DoWorkAsync()), als Thread oder als Prozess ? Ich würde letzeres empfehlen, NX als Prozess im Hintergrund starten, dann ggfs. StdOut und StdErr abfangen sowie das Ende des Prozesses abwarten. Das hat m.E. keine oder nur eine geringe Rückwirkung auf die WinForm. Daneben: Willst du mehrere Threads/Prozess parallel laufen lassen ? Gruß, Michael ------------------ Ein Mensch wird laut, wenn er was will; wenn er's erst hat, dann wird er still; Das "Danke" ist, nach alter Sitte, Weit selt'ner als das "Bitte, Bitte". Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nxdev Mitglied Softwareentwickler
Beiträge: 5 Registriert: 15.03.2024
|
erstellt am: 21. Mrz. 2024 10:17 <-- editieren / zitieren --> Unities abgeben:
Zu 1. Genau, es ist eine Windows Forms Anwendung. Durch das Ausführen im Hintergrund wurde ja das Einfrieren des UI´s bereits verhindert. Deshalb brauche ich das DoEvents() nicht. Zu 2. Es wird als Prozess gestartet und dabei wird der StandardOutput sowie der Error ebenfalls ausgegeben. Die genannte Fehlermeldung taucht aber im NX Log auf... Zur letzten Frage: Das Programm wird nicht Parallel ausgeführt, was aber möglich ist. Sinn macht es aber eher weniger. Viele Grüße Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2704 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-2306 3D Printer Prusa MK2 S
|
erstellt am: 22. Mrz. 2024 17:39 <-- editieren / zitieren --> Unities abgeben: Nur für nxdev
Hallo nxdev, irgendwo in deinem Code wird sich ein Thread.Start() befinden. Anders ist die Meldung in Log nicht zu erklären. Das kann, falls nicht selbst explizit geschrieben, auch durch die Verwendung z.B. eines Background Workers geschehen sein. Zum Eingrenzen der Suche nach dem Verursacher kannst du ja selbst was ins Logfile schreiben. Gruß, Michael
------------------ Ein Mensch wird laut, wenn er was will; wenn er's erst hat, dann wird er still; Das "Danke" ist, nach alter Sitte, Weit selt'ner als das "Bitte, Bitte". Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nxdev Mitglied Softwareentwickler
Beiträge: 5 Registriert: 15.03.2024
|
erstellt am: 25. Mrz. 2024 09:05 <-- editieren / zitieren --> Unities abgeben:
Hallo Michael, nur in dem Code Ausschnitt den ich hier aufgeführt habe, wird Threading benutzt, um das eigenständige NXOpen Programm wo auch die GetSession() aufgerufen wird auszuführen. Darin wird kein Threading benutzt. Es gibt auch keinen anderen BackGround Worker, weder im UI noch im NXOpen Programm. Viele Grüße
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nxdev Mitglied Softwareentwickler
Beiträge: 5 Registriert: 15.03.2024
|
erstellt am: 25. Mrz. 2024 13:39 <-- editieren / zitieren --> Unities abgeben:
Hallo Michael, habe den Fehler entdeckt. Tatsächlich prüfe ich im Vorfeld (im UI) noch die Item ID ab, was natürlich auch im Background geschieht. Das erzeugt die Meldung in meiner Logfile Zurecht. Ich war aber iwie auf mein asynchron ausgeführtes Programm fixiert und hab daran gar nicht mehr gedacht... Danke für deine Hilfe!
Viele Grüße Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Praktikum Produktentwicklung Konstruktion Hochdruckreiniger | WARUM STIHL. Als innovatives Familienunternehmen und führende Weltmarke im Bereich Motorsägen und -geräte beschäftigen wir uns neben klassischen Geschäftsfeldern auch intensiv mit Robotik, Akku, Elektrotechnik, E-Commerce und Digitalisierung. Wir bieten alle Voraussetzungen, persönlich und beruflich zu wachsen. Gemeinsam mit über 20.000 Mitarbeitenden gestalten wir die Zukunft - vorausschauend und verantwortungsbewusst.... | Anzeige ansehen | Entwicklung |
|
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2704 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-2306 3D Printer Prusa MK2 S
|
erstellt am: 25. Mrz. 2024 17:19 <-- editieren / zitieren --> Unities abgeben: Nur für nxdev
Hallo nxdev, schön, daß es nun doch aufgetaucht ist, irgendwo musste der Hund ja begraben sein. Ohne Anlass schreibt NX i.d.R. keine Meldung. Gruß, Michael
------------------ Ein Mensch wird laut, wenn er was will; wenn er's erst hat, dann wird er still; Das "Danke" ist, nach alter Sitte, Weit selt'ner als das "Bitte, Bitte". Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|