Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  NX Programmierung
  Main Thread Probleme beim asynchronen Ausführen von NXOpen Programmen

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 NX
  
Von Software-as-a-service bis zu PLM in der Cloud: Turbo Gears Service Kempten setzt auf NX CAD und RuleDesigner PDM (NX)
Autor Thema:  Main Thread Probleme beim asynchronen Ausführen von NXOpen Programmen (278 / mal gelesen)
nxdev
Mitglied
Softwareentwickler

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

Beiträge: 5
Registriert: 15.03.2024

erstellt am: 15. Mrz. 2024 14:22    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 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


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

Beiträge: 2690
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 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 nxdev 10 Unities + Antwort hilfreich

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

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

Beiträge: 5
Registriert: 15.03.2024

erstellt am: 18. Mrz. 2024 08:05    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 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


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

Beiträge: 2690
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 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 nxdev 10 Unities + Antwort hilfreich

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

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

Beiträge: 5
Registriert: 15.03.2024

erstellt am: 21. Mrz. 2024 10: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

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


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

Beiträge: 2690
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 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 nxdev 10 Unities + Antwort hilfreich

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

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

Beiträge: 5
Registriert: 15.03.2024

erstellt am: 25. Mrz. 2024 09:05    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 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

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

Beiträge: 5
Registriert: 15.03.2024

erstellt am: 25. Mrz. 2024 13:39    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 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



Werkstudententätigkeit im Bereich Prototypenbau und 3D-Druck ab Juni 2024
Life is always about becoming? Im Leben geht es darum, sich auf eine Reise zu begeben, um die beste Version unseres zukünftigen Selbst zu werden. Während wir Neues entdecken, stellen wir uns Herausforderungen, meistern sie und wachsen über uns hinaus.

Bewerben Sie sich bei Mercedes-Benz und finden Sie den Aufgabenbereich, in dem Sie Ihre Talente individuell entfalten können. Dabei werden Sie von visionären Kolleginnen und Kollegen unterstützt, die Ihren Pioniergeist teilen....
Anzeige ansehenMaschinenbau
mseufert
Moderator
Freiberuflicher CAD/CAM Ingenieur


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

Beiträge: 2690
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 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 nxdev 10 Unities + Antwort hilfreich

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 >>)

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)2024 CAD.de | Impressum | Datenschutz