| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für NX |
Autor
|
Thema: For-Schleife anhalten (1836 mal gelesen)
|
mabi86 Mitglied Student
Beiträge: 9 Registriert: 02.05.2012 NX 8
|
erstellt am: 02. Mai. 2012 13:33 <-- editieren / zitieren --> Unities abgeben:
Hallo! Da ich sehr zeitaufwendige Simulationen mithilfe eines Journals durchführe bin ich auf der Suche nach einem Befehl, der eine "For-Schleife" erst dann wiederholt, sobald der Berechnungsschritt abgeschlossen ist, sprich der Solver ein Ergebnis liefert. Die derzeit verwendete Sleep-Funktion ist leider nur bedingt anwendbar, da die Simulationszeiten stark variieren. Code ist in VB verfasst. Bin um jede Hilfe dankbar . Lg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gfx-toxic.de Moderator Konstruktion / Anwenderbetreuung
Beiträge: 501 Registriert: 09.06.2006 Teamcenter 11.3 / NX 11 Windows 10
|
erstellt am: 03. Mai. 2012 06:23 <-- editieren / zitieren --> Unities abgeben: Nur für mabi86
|
mabi86 Mitglied Student
Beiträge: 9 Registriert: 02.05.2012 NX 8
|
erstellt am: 03. Mai. 2012 07:32 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen! Grundsätzlich sieht der Ablauf so aus, dass ich eine neue Geometrie aus einem Excel-Sheet lade, diese speicher und schlussendlich berechne. Die For-Schleife dient lediglich dazu, die Countervariable weiterlaufen zu lassen. Das ganze manuell zu überwachen wäre zu zeitaufwendig und bei Definition einer Sleepdauer habe ich das Problem, dass Anfangs 1 Minute ausreicht, bei den letzten allerdings mind. 1 Stunde benötigt wird. Den Aufruf mache ich manuell nur bei der ersten Geometrie. Der Rest ist im Journal bzw. Excel-File vorgebenen, sodass alle Kombinationen durchsimuliert werden. Lg Mario
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gfx-toxic.de Moderator Konstruktion / Anwenderbetreuung
Beiträge: 501 Registriert: 09.06.2006 Teamcenter 11.3 / NX 11 Windows 10
|
erstellt am: 03. Mai. 2012 07:48 <-- editieren / zitieren --> Unities abgeben: Nur für mabi86
Die Fragen ist, wie startest du den Solver. Machst du es über System.Diagnostics.Process? Weil dann wäre es relativ einfach das ganze abzufragen. Oder kannst du vielleicht prüfen ob die nastran.exe (bzw. der Solver) noch läuft und wenn dieser beendet wurde mach das nächste? Zeig mal ein Stück Code wo der Solver gestartet wird. Da gibt es so viel Möglichkeiten, da kann man nur ins Blaue raten. ;-) ------------------ Gruß Matthias ------------------------------------ ICQ: 163190295 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mabi86 Mitglied Student
Beiträge: 9 Registriert: 02.05.2012 NX 8
|
erstellt am: 03. Mai. 2012 08:04 <-- editieren / zitieren --> Unities abgeben:
Der Solver wird so gestartet: Dim simSimulation1 As CAE.SimSimulation = CType(workSimPart.FindObject("Simulation"), CAE.SimSimulation) Dim simSolution1 As CAE.SimSolution = CType(simSimulation1.FindObject("Solution[Solution 1]"), CAE.SimSolution) simSolution1.Solve(CAE.SimSolution.SolveOption.Solve, CAE.SimSolution.SetupCheckOption.CompleteCheckAndOutputErrors) Genau diese Abfrage des Solverstatuses hätte ich im Sinn gehabt. Nur leider weiß ich nicht, auf welche Daten ich zugreifen kann, bzw. wie ich den Status des Solvers abfragen kann. Ich hoffe der Code hilft, viel ist es ja nicht. LG
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mabi86 Mitglied Student
Beiträge: 9 Registriert: 02.05.2012 NX 8
|
erstellt am: 03. Mai. 2012 08:22 <-- editieren / zitieren --> Unities abgeben:
|
mabi86 Mitglied Student
Beiträge: 9 Registriert: 02.05.2012 NX 8
|
erstellt am: 04. Mai. 2012 07:58 <-- editieren / zitieren --> Unities abgeben:
Hallo! Habe mich gestern intensiver mit der Funktion System.Diagnostics.Process auseinander gesetzt und glaube, dass dies zum Erfolg führen könnte. Allerdings bekomme ich noch immer eine Fehlermeldung: "Der Wert des Typs 1-dimensionales Array von System.Diagnostics.Process kann nicht in System.Diagnostics Process konvertiert werden"! Sobald ich dann bei der Definition der Variable "nastranProcess" Klammern setze, kommt die Fehlermeldung, dass HasExited und Refresh keine Member von System.Array sind... Wäre toll, wenn mit jemand einen Hinweis geben könnte, da ich derzeit nicht wirklich weiterweiß! Hier der derzeitige Code: Try Dim Process_Name As String = "nastran" Dim nastranProcess As System.Diagnostics.Process nastranProcess = Process.GetProcessesByName(Process_Name) Dim i As Integer For i = 0 To 10000 If not nastranProcess.HasExited Then nastranProcess.Refresh() Thread.Sleep(2000) Else Exit For End If Next i Finally End Try Lg, Mario Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mabi86 Mitglied Student
Beiträge: 9 Registriert: 02.05.2012 NX 8
|
erstellt am: 04. Mai. 2012 11:06 <-- editieren / zitieren --> Unities abgeben:
Habe das Problem soeben gelöst: Try Dim i As Integer Dim processName As String = "nastran" Dim nastranProcess As Process() For i=0 To 10000000 nastranProcess = Process.GetProcessesByName(ProcessName) If nastranProcess.Length=0 Then Exit For Else Sleep(2000) End If Next i Catch ex As Exception MsgBox("Error!") End Try
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gfx-toxic.de Moderator Konstruktion / Anwenderbetreuung
Beiträge: 501 Registriert: 09.06.2006 Teamcenter 11.3 / NX 11 Windows 10
|
erstellt am: 04. Mai. 2012 11:15 <-- editieren / zitieren --> Unities abgeben: Nur für mabi86
Hi mabi, schön zu sehen das du dir auch selbt den Kopf zerbrichst. Aber ich denk es geht schöner wie mit einer for-schleifen. es gibt in der Process Klasse ein Event das ausgelöst wird, wenn das Programm beendet wird. Das ganze kannst du abfragen mit... nastranProcess.EnableRaisingEvents = true; nastranProcess.Exited += new EventHandler(nastranProcess_Exited); und damit wird die Methode nastranProcess_Exited aufgerufen...wo du dann zum nächsten Objekt springen kannst. Probiers mal aus. Wie das ganze aber genau mit vb.net aussieht kann ich dir nicht sagen bin mit c# unterwegs. ------------------ Gruß Matthias ------------------------------------ ICQ: 163190295 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Senior Ingenieur (m/w/d) Entwicklung/Konstruktion | Akkodis - entstanden durch den Zusammenschluss von AKKA & Modis - ist ein weltweit führendes Unternehmen im Bereich Engineering & IT. Als globaler Partner in einer sich ständig verändernden Technologie- & Wettbewerbsumgebung unterstützen wir unsere Kunden mit unserem 360°-Angebot dabei, eine nachhaltigere & smartere Zukunft zu gestalten. Vereint durch unsere gemeinsame Leidenschaft für Technologie & Talente betrachten wir die Welt aus einem neuen Blickwinkel.... | Anzeige ansehen | Maschinenbau |
|
mabi86 Mitglied Student
Beiträge: 9 Registriert: 02.05.2012 NX 8
|
erstellt am: 07. Mai. 2012 07:53 <-- editieren / zitieren --> Unities abgeben:
Danke für den Hinweis! Würde dadurch wirklich vereinfacht werden, allerdings funktionieren bei mir die Methoden der Process-Klasse nicht richtig. So wird bei der Verwendung von .EnableRaisingEvents oder .HasExited immer eine Fehlermeldung "kein Member von System.Array" ausgeworfen. Hatte dasselbe Problem auch bei den Methoden .Refresh und .HasExited in vorigen Versuchen. Denke ich werde es bei der alten For-Version belassen, auch wenn sie nicht besonders schön anzuschauen ist. Schönen Tag noch! Lg Mario Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |