Installiertes Programm macht Fehler beim Beenden - Druckversion +- LabVIEWForum.de (https://www.labviewforum.de) +-- Forum: LabVIEW (/Forum-LabVIEW) +--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein) +---- Forum: Application Builder (/Forum-Application-Builder) +---- Thema: Installiertes Programm macht Fehler beim Beenden (/Thread-Installiertes-Programm-macht-Fehler-beim-Beenden) |
Installiertes Programm macht Fehler beim Beenden - rolfk - 10.07.2008 08:35 ' schrieb:die Quit LabVIEW Primitive ist (bei mir) die letzte Funktion überhaupt, die im Haupt-VI aufgerufen wird. vorher wurde schon alles "sauber" deinitialisiert, etc - da läuft definitiv nix mehr in der ganzen VI Hierarchie, wenn diese Funktion dran kommt - und dient eigentlich nur dazu der LV Runtime Engine den Befehl zu geben "so, jung, wir sind feddich hier, kannst abbaun!";) Wenn Du Dein Programm so strukturiert hast brauchst Du das Quit gar nicht mehr. Sobald Du das letzte verbliebene Frontpanel innerhalb einer Exe schliesst beendet sich das Exe automatisch. Das ist schon so gewesen seit es LabVIEW Exes gibt und war für gewisse Leute ein Grund zum meckern da sie dadurch keine unsichtbaren LabVIEW Deamons programmieren zu können glaubten. (Glaubten deshalb weil es doch geht. Man muss nur erst eine VI Referenz zu dem VI selber öffnen und solange die innerhalb einer Running VI-Hierarchy aktiv bleibt bleibt das entsprechende VI auch im Speicher). Der einzige Grund warum ein LabVIEW Exe sich nicht ordentlich verabschiedet obwohl alle aktiven VI Referenzen geschlossen wurden und das letzte Frontpanel ebenfalls, ist wenn das LabVIEW Programm noch irgendwo in einem Treiber stecken bleibt. Das braucht nicht mal in einem Aufruf zur Treiber-DLL selber zu sein sondern kann auch in der Cleanuproutine dieses Treibers sein. Aber: 1) ist das dann irgendwie ein Bug im entsprechenden Treiber und 2) hilft LabVIEW Quit hier auch nicht Mit dem Quit deckst Du im Prinzip nur eventuel nicht ordentlich abgeschlossene Tasks (Deamons, Loops, etc) und im Falle von buggy DLL Treibern die sich beim Unloaden verheddern wenn noch Resourcen durch die Applikation geöffnet sind, kannst Du sogar einen Zombieprozess erzeugen: Das LabVIEW Programm wurde gewaltsam beendet bevor der Task der die Resource verwaltet die Möglichkeit hatte um diese ordentlich abzuschliessen und ist nun selber weg aber der Prozess wird durch den fehlerhaften Treiber daran gehindert wirklich aus dem Speicher entfernt zu werden. Die Folge ist dass Du den Zombie nur noch durch den Task Manager beenden kannst und wenn sich der Treiber in den Tiefen des Windows Kernels selber verirrt hat eventuel gar nicht mehr. Und wer hier nun sagt dass das in Windows 32bit nicht geht dem kann ich nur sagen dass ich das selber so gesehen habe. Die einzige Lösung um dann wieder zu einem funktionierenden System zu kommen ist der Powerknopf. Ich programmiere nun schon über 16 Jahre in LabVIEW, beinahe 12 davon professionel als Alliance Member und ich habe die Quit-Funktion noch in keiner Applikation eingebaut. Ist einfach nicht nötig da ich ganz einfach dafür sorge dass sich alle Loops ordentlich beenden und als Letztes macht das HauptVI das Licht aus indem es ganz einfach ein FP.Close macht. Wenn dann noch etwas läuft habe ich was falsch gemacht, das durch die Quit-Funktion höchstens kaschiert würde. Rolf Kalbermatter Installiertes Programm macht Fehler beim Beenden - rolfk - 10.07.2008 09:06 ' schrieb:Ich hab das jetzt mal ausprobiert mit der Methode FP.Close und der Eigenschaft FP.Open=false. Ich muss schon sagen - lange nicht mehr so viel Mist gesehen. Du regst Dich hier ganz unnötig auf! Wer hindert Dich denn daran da FP.Close nur auszuführen wenn Du in einem Exe bist?? Und dass da FP.Close steht aber das Diagramm auch dicht geht hat einen ganz einfachen Grund der aus den Urzeiten von LabVIEW stammt. Das VI und alle darunterliegenden Dinge hingen damals ganz einfach am Frontpanel. Heute ist das wohl grundsätzlich etwas anders da FP != VI ist aber damals war es grundsätzlich unmöglich um ein BD offen zu haben ohne dass das FP auch offen ist. Und dieses Verhalten wurde bis heute ganz einfach beibehalten und das finde ich auch ganz logisch, aber vielleicht ist das ja nach >16 Jahren LabVIEW ganz einfach "deformation professional". ' schrieb:Da bei Exe nur diejenige beendet wird, für die das "Quit LV" ausgeführt wird, wird wohl Punkt 2 zutreffen. Mglw. habe ich mich auch etwas ungeglücklich ausgedrückt. Zu diesem Punkt ist ganz einfach zu sagen dass die LabVIEW Runtime eigentlich nichts anders als eine Library an Funktionen ist. Das LabVIEW Exe selber ist der eigentliche Prozess der in den Speicher geladen wird und dort instantiert wird. Nachdem der sich im Speicher initialisiert hat lädt er die lvrt.dll und übergibt ihm die weitere Kontrolle. Aber diese lvrt.dll läuft immer im Kontext des ursprünglichen Przesses der durch die Exe instantiert wurde. Ein anderes LabVIEW Exe lädt die lvrt.dll ganz einfach auch und dann läuft diese halt ein weiteres mal innerhalb dieses zweiten Prozesskontextes. Soweit es die lvrt.dll betrifft hat die im Prinzip keinerlei Kenntnis davon dass sie innerhalb eines anderen Prozesses auch schon geladen wurde. Im Prinzip deshalb da ein Exe normalerweise beim Starten testet ob es schon läuft (derselbe exe Name schon im Speicher) und in dem Falle das Laden der Applikation abbricht. Dieser Check kann aber durch ein INI Token innerhalb des INI Files der Applikation ausgeschaltet werden, was aber meist nicht sinnvoll ist. Rolf Kalbermatter Installiertes Programm macht Fehler beim Beenden - kpa - 10.07.2008 09:10 Hallo, auf dem Rechner auf dem das Programm läuft ist nur das Programm, LabVIEW Runtime und DAQmx Runtime. Wie kann ich LabVIEW Runtime und DAQmx Runtime beenden wenn ich die *.exe beende? Ich habe inzwischen mit NI telefoniert und Tips bekommen aber der Rechner ist beim Kunden und das Programm ist noch nicht repariert. Für DAQmx 8.6 gibt es eine Runtime 5 damit hat es auf dem Programmierrechner und auf dem Zielrechner gefunzt. Nach Installation von LV 8.5.1 mit DAQmx 8.7(Ohne Runtime 5 -- nur noch Runtime 4) ging es nur noch auf dem Programmierrechner. Nach der Installation einer neueren Version (Tip von NI) DAQmx 8.7.1 (sollte wieder Runtime 5 enthalten-- dem war nicht so) ging es noch nicht. Es gibt eine extra DAQmx 8.7.1 Runtime 5 aber da muss man alles von Hand einbinden. In einem anderen Forum wurde geraten auf DAQmx 8.6 zurückzugehen (auch wegen der geringeren Größe von Runtime 5 gegenüber Runtime 4). DAQmx 8.7 war nicht deinstallierbar weil LabVIEW sagte es ist eine höhere Version installiert (8.7.1) die aber nicht in LabVIEW angezeigt wurde. NI gab mir den Link zu MSIBlast (Programm zum Deinstallieren von NI-Komponenten) dann konnte ich DAQ deinstallieren. Danach ging nichts mehr. Ich habe LV komplett deinstalliert und LV8.1 neuinstalliert. Alles läuft wieder -- Ich habe ein neues Installationsprogramm + LabVIEW Runtime + DAQmx 8.6 Runtime 5 gemacht und muss es aber auf dem Zielrechner noch testen. Gibt es andere Möglichkeiten LabVIEW Runtime zu beenden ohne "Quit LV" ? Danke für die Hilfe kpa Installiertes Programm macht Fehler beim Beenden - rolfk - 10.07.2008 09:23 ' schrieb:Hallo, Bugs innerhalb der DAQmx mal weggelassen denke ich dass gerade Quit LV das eigentlich Problem sein könnte. Wenn Du in Deiner Applikation DAQmx ansprichst öffnest Du unweigerlich DAQmx Resourcen. Wenn Du Dich nun irgendwann mal in Deiner Applikation entschliesst dass es genug gewesen ist und einfach Quit LV aufrufst hast Du eventuel noch DAQmx Resourcen offen, die erst abgeschlossen werden sollten. Zwar ist DAQmx so programmiert dass es grundsätzlich versucht nicht ordnungsgemäss abgeschlossene Resourcen selber abzuschliessen wenn die Applikation beendet wird aber DAQmx besteht aus einer Vielzahl an Untertreibern und ein einziger Bug in einem davon kann verursachen dass sich DAQmx beim dermassen forcierten Abschliessen aufhängt. Deshalb ist es grundsätzlich wichtig um beim Beenden der Applikation dafür zu sorgen dass alle parallelen Loops innerhalb der Applikation sich ordentlich beenden und dass alle irgendwann geöffneten Resourcen auch garantiert geschlossen sind bevor Du überhaupt daran denkst Quit LV aufzurufen. Wie eher erwähnt ist Quit LV nicht mal nötig. Das Letzte VI das sein Frontpanel schliesst macht grundsätzlich beinahe dasselbe. Vielleicht denkst Du jetzt: Aber das ganze Resourcetracking um sicherzustellen dass alles ordentlich geschlossen ist bevor ich meine Applikation beende ist eine Heidenarbeit. Nun wenn Du intelligent programmierst, sprich zumindest in Ansätzen objektorientiert mittels Intelligenter Actions Engines auf der Basis von LV2 Style Global Variables, ist das alles nicht so schlimm. Und obwohl die NI Treiber selber in den meisten Fällen sehr tolerant darin sind wenn die Applikation sich beendet ohne alle Resourcen ordentlich abgeschlossen zu haben ist das nicht immer 100% perfekt und kann man das von den meisten Treibern anderer Hersteller mit absoluter Garantie schon mal nicht sagen. Rolf Kalbermatter Installiertes Programm macht Fehler beim Beenden - kpa - 10.07.2008 10:52 Hallo, wie schon in meiner Frage ganz am Anfang erwähnt sind alle Schleifen beendet, Dateien sind geschlossen und auch DAQmx ist ordentlich abgeschlossen. In meiner Haupt-Whileschleife laufen ein paar Berechnungen alle anderen Programme wie Datenerfassung (DAQmx) und Datei-IO werden in Sub-VI's ausgeführt und danach komplett beendet. Nach Beenden der Haupt-Whileschleife (alles ist jezt beendet) folgt "Quit LabVIEW". Das funzt installiert auf einem Rechner und auf dem anderen nicht. Da es aber schon mal ging denke ich es war der neue DAQmx-Treiber. Wenn ich mehr weiss werde ich es hier schreiben. kpa Installiertes Programm macht Fehler beim Beenden - rolfk - 10.07.2008 17:00 ' schrieb:Hallo, Verwendest Du irgendwo Timed Loops? Die sind bekannt dass sie ganz komische Crashes verursachen wenn man die Applikation zu beenden versucht. Sehen ziemlich harmlos aus aber die eigetnliche Implementation ist so ein wenig alles was die LabVIEW Götter uns Normalsterblichen mit ziemlichen Erfolg nicht benützen lassen wollen. Und der Grund ist auch einfach: Es ist bestenfalls haarig zu implementieren und schlimmstenfalls der pure Wahnsinn, was Debugging und Unterhalt betrifft. (XNodes und anderes dergleichen). Rolf Kalbermatter Installiertes Programm macht Fehler beim Beenden - cb - 11.07.2008 12:24 ' schrieb:Ich programmiere nun schon über 16 Jahre in LabVIEW, beinahe 12 davon professionel als Alliance Member und ich habe die Quit-Funktion noch in keiner Applikation eingebaut. Ist einfach nicht nötig da ich ganz einfach dafür sorge dass sich alle Loops ordentlich beenden und als Letztes macht das HauptVI das Licht aus indem es ganz einfach ein FP.Close macht. Wenn dann noch etwas läuft habe ich was falsch gemacht, das durch die Quit-Funktion höchstens kaschiert würde. reg dich wieder ab- ganz ahnungslos bin ich auch nicht;)und son bischen Fachwissen kannst du mir ruhig auch zugestehen Installiertes Programm macht Fehler beim Beenden - Y-P - 11.07.2008 12:26 :offtopic2:Langsam nähern wir uns von der Anzahl der Antworten her unserem Rätselthread. Gruß Markus |