LabVIEWForum.de - Wie trotz laufender Schleife user-responsiv?

LabVIEWForum.de

Normale Version: Wie trotz laufender Schleife user-responsiv?
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

ich sitze nun schon seit gut 4 Stunden vor einem Bug in meinem Programm und weis einfach nciht weiter, hoffe ich habe hier etwas mehr glück Rolleyes

Mein Programm verfuegt im wesentlichen über ein Frontpanel, ueber welches die ganze Kommunikation mit dem Benutzer läuft. Mehrere XControls verarbeiten dabei die benutzeingaben, antowrten diesem etc.

Das Programm steuert ein mikroskop. Dieses Mikroskop kann man auf "live" schalten. Dabei läuft im Hintergrund dann solange eine Schleife, die die bilder aufnimmt (und in eine queue schiebt, von wo eine andere schleife sie dann wieder liest und ausgibt), bis man eben "live" deaktiviert.
Dies funktionierte vor einiger Zeit noch problemlos, während die schleife im hintergrund bilder aufnahm, blieb das frontpanel responsiv bzgl benutzereingaben.

Jetzt ist es aber so, das man das Frontpanel sobald die schleife läuft nciht mehr bedienen kann. Es ist nciht nur langsam, es scheint so als ob es gar nciht aktiv sei. Auch habe ich die Schleife ueber "waits" oder direkt unter execution control->priority den restlichen funktionen versucht zurückzustellen, ohne erfolg. das frontpanel reagiert ueberhauopt nciht, das heist alle XControls verarbieten keine daten mehr.

Beim debuggen sieht es jedoch so aus, als liefe alles prima und als sei das programm nciht in einer schleife hängen geblieben

Die Schleife habe ich auch an meinen beitrag angehängt, allerdings fehlen die subvi's, diese sind aber meiner meinung nach auch nciht relevant, weil der effekt der gleiche ist, wenn ich alle subvis ausklammere und bspw. nur noch das "time-delay" in der schleife lasse.

Dann bin ich aml auf eure Ideen gespannt und schon mal vielen dank im vorraus,
gruß steffen
noch eine kleine anmerkung, falls ich das schlecht ausgedrückt habe: Das Frontpanel reagiert nciht langsam während die schleife läuft - es reagiert überhaupt nciht mehr (oder eben so langsam das ich denke es reagiere überhauot cniht mehr^_^)

gruß!!
Hast du vielleicht ein Problem mit den Timeouts der Queue-Funktionen?
' schrieb:Beim debuggen sieht es jedoch so aus, als liefe alles prima und als sei das programm nciht in einer schleife hängen geblieben
Wenn Du erst auf debuggen schaltest, nachdem die Schleife hängt, müßtes Du doch sofort sehen können, wo es hängenbleibt.
Eine bewährte Technik ist auch, in das i eine Anzeuge anzuschließen, damit man sieht, nach wie vielen Schleifendurchläufen es hängt.
Die Debugg-Funktionen in LV sind für mich mit das Beste an LV überhaupt. Damit in wenigen Minuten herauszufinden, wo genau die Schleife hängt, ist überhaupt kein Problem. Natürlich muß man sich damit vertraut machen. Mit Ein- und Ausschalten der gelben Lampe allein kommt man wirklich nicht weit.

Sehr seltsam ist: Die Quere wird bei jedem Schleifendurchlauf neu erzeugt, bevor ein neues Datenelement hineingeschoben wird. Ich weiß wirklich nicht, was da passiert, will es auch nicht wissen, das ist doch kein normales Programmieren. Man erzeugt doch die Queue im Regelfall nur ein Mal bei der Initialisierung des VIs.
' schrieb:Sehr seltsam ist: Die Quere wird bei jedem Schleifendurchlauf neu erzeugt, bevor ein neues Datenelement hineingeschoben wird. Ich weiß wirklich nicht, was da passiert, will es auch nicht wissen, das ist doch kein normales Programmieren. Man erzeugt doch die Queue im Regelfall nur ein Mal bei der Initiaisierung des VIs.

Sehr sauber ist das nicht, aber es gibt beim ObtainQueue-VI ja den Eingang "Create if not found"...d.h. wenn schon eine Queue existiert, und das ist nach dem ersten Aufruf der Fall, wird die Queue nicht neu erzeugt sondern die bestehende verwendet!
' schrieb:Sehr sauber ist das nicht, aber es gibt beim ObtainQueue-VI ja den Eingang "Create if not found"...d.h. wenn schon eine Queue existiert, und das ist nach dem ersten Aufruf der Fall, wird die Queue nicht neu erzeugt sondern die bestehende verwendet!

Ja, so wie ich das VI verstehe, wird einfach die bestehende queue wieder herangezogen, ich versuch es mal zu aendern, aber wie gesagt, das problem besteht auch wenn die schleife komplett leer ist (+ eben ein wait).

Mit "das es beim debuggen normal aussieht" meinte ich, das im Debugmodus das Programm eben gerade nicht in der queue haengen bleribt, diese laeuft zwar, es werden aber auch die anderen Schleifen des Hauptprogramms bedient, welche beispielsweise die Events der X-Controls abfragen, nur die XControls selbst scheinen "tot" zu sein und reagieren eben nciht mehr auf benutzeraktionen.
' schrieb:Sehr sauber ist das nicht, aber es gibt beim ObtainQueue-VI ja den Eingang "Create if not found"...d.h. wenn schon eine Queue existiert, und das ist nach dem ersten Aufruf der Fall, wird die Queue nicht neu erzeugt sondern die bestehende verwendet!
Ja, das ist schon klar, aber wenn die einzige Funktion dann darin besteht, die Schleife künstlich um 1 ms zu verlangsamen, dafür gibt es die Wait-Funktion, mit dem Vorteil, daß die CPU sich in dieser Zeit einer anderen Task zuwenden kann.
Hallo,
ich habe das Programm nun etwas umgebaut, jetzt funktioniert es - leider ohne sicher zu wissen was das Problem war.

Mir scheint es, als lag das Problem daran, das ich 2 ineinander geschachtelte While Schleifen hatte - jede fuer sich blockiert das Programm nicht, zusammen ging aber nichts mehr... nur seltsam das es davor auch lief Wink

Aber vielen dank fuer eure Hilfe!!

Gruesse Steffen
Referenz-URLs