Ich steh wieder mal vor einem Rätsel. Mein Programm lässt eine Schleife ca. 55000 mal durchlaufen (die Anzahl wird später auch variieren. Nach mehr als 20000 Durchläufen (beim letzten Test ca. 21000, mal bei 28000...) kommt die Fehlermeldung, dass ein endwhile ohne while/whilenot/whileloop im Programm ist. Das kann aber nicht sein. Meine Proc beinhaltet 2 Schleifen (eine in der anderen), 2x whileloop, 2x endwhile. Ich habs mit For probiert, da kommt die Meldung mit EndFor. Ich kann leider nicht meine Proc posten, weil die ohne den Rest des Programms nicht funktioniert. In der Proc läuft auch 1 Timer (mittels SetTimerA-API) und eine Funktion, die in der Proc aufgerufen wird, benutzt Callbacks. Ich habs ohne den Timer probiert, gleiches Ergebnis. Keine Breaks.
Es gab mal Probleme mit While, Roland hat aber geschrieben, dass die jetzt behoben seien. Kann da trotzdem noch ein Wurm drin sein?
Fehlermeldung für angebliches endwhile ohne while
-
-
-
Riecht nach Speicherleck, oder Ressourcen von Windows gehen aus. Ist es nach einem kompletten Neustart des Computers besser?
-
Nö. Aber Speicherleck könnte es wirklich sein. Seufz, das wird umfangreich.
-
das wird umfangreich.
Vielleicht nicht. KernelLeak schon mal ausprobiert? -
Vielleicht nicht. KernelLeak schon mal ausprobiert?
Nee. Sagt mir nix. Hilf mir kurz auf die Sprünge.
Ich hatte das Problem schon in einem anderen Projekt. Damals hatte Roland wohl aber einen Fehler in XProfan X2 gefunden und behoben. Jetzt habe ich noch was kurioseres entdeckt:
Ich habe eine Funktion, die 1 (Erfolg) oder 0 (Fehler) zurückgibt. Diese ruft eine API auf, FTPGetFile. Der Rückgabewert wird direkt zurückgegeben. Also in etwaJetzt kam immer mal 0 zurück, obwohl die Datei runtergeladen wurde. Ich dachte schon, ok, die API hat halt 0 zurückgegeben, aus irgendeinem Grund. Pustekuchen: Das Ergebnis ist immer 1. Ich habe result% direkt nach Empfang des Ergebnisses ausgeben lassen und dann direkt von der Funktion, die diese Unterfunktion aufgerufen hat, also in etwa
Code
Alles anzeigenproc Callme declare result% result%=FTPGetFile(...) Print Str$(result%) Return result% endproc cls Print Str$(Callme()) waitinput
...in unvollständiger, verkürzter Form. Erstaunlicherweise wird immer mal "1 0" ausgegeben, was eigentlich nicht sein kann...
-
-
Ich schau gleich rein. Ich hab noch etwas experimentiert und beim letzten Durchlauf folgendes festgestellt:
Der Aufbau ist in etwa so:Der Fehler trat auf, nachdem die innere Schleife nach genau 56591 Durchläufen verlassen wurde (so sollte es sein). Es ist als ob mein Programm vergessen hat, dass es noch in der anderen Schleife war...
-
Also, zur WhileLoop - Schleife kann ich nur sagen, daß sie
ordnungsgemäß funktioniert. Habs jetzt grad mal bis in
den 2stelligen Millionenbereich sogar mit Aufruf einer Proc
probiert.Dauert zwar, aber geht bis zum Ende korrekt durch.
-
Also, zur WhileLoop - Schleife kann ich nur sagen, daß sie
ordnungsgemäß funktioniert. Habs jetzt grad mal bis in
den 2stelligen Millionenbereich sogar mit Aufruf einer Proc
probiert.Dauert zwar, aber geht bis zum Ende korrekt durch.
Ich habe über 6 Millionen Aufrufe probiert. Aber das Problem könnte die Verschachtelung sein. Ich lasse mein Programm gleich nochmal ohne echten Download laufen (normaler Ablauf, nur die Funktion zum Download springt gleich zurück). Die Vorbereitung dauert leider etwa 45 Minuten.
-
Taskmanager öffnen. Auf die verbratenen Kernelhandels und den Speicher schauen. Bei laufend ansteigenden Handels helfen dir die zwei von mir verlinkten Programme weiter (auch wenn es ein Fehler in XProfan sein sollte).
Mit KernelLeak kannst du feststellen, welche Art von Handels nicht geschlossen werden. Mit AHTHandles erhälst du weitere Infos zu den Handels und kommst eventuell auf das genaue Objekt. -
Test läuft. Die Handle sinds nicht, ist von 325 auf 327 gesprungen und stabil...
-
Noch ein Nachtrag :
Ich hatte mal vor Monaten ein ähnliches Problem. Dabei hatte ich
einen Quellcode-Teil aus einem der 3 Foren hier in den Profaneditor
kopiert. Nur war das kein Code zwischen den Code-Tags, sondern
auf der Website als HTML-Text.Da wunderte es mich auch, daß ich einen solchen Fehler bekam,
obwohl die Schleifenkörper richtig in meinem Quellcode standen.
Nach ewigem Suchen hatte ich dann festgestellt, daß die Leerzeichen
vor dem Code (wegen Einrückung) gar keine richtigen Leerzeichen waren
und somit der Interpreter den Befehl / EndWhile gar nicht erkannte.Erst eine Nachbearbeitung mit dem Profaneditor (mit Backspace und
Einrücken mit der Leertaste) brachte den Erfolg.Ist nur mal als Hinweis. Man kann ja sämtliche Möglichkeiten in
Betracht ziehen. -
Test läuft. Die Handle sinds nicht, ist von 325 auf 327 gesprungen und stabil...
Speicherverbrauch auch mal im Taskmanager im Auge behalten.
-
Noch ein Nachtrag :
Ich hatte mal vor Monaten ein ähnliches Problem. Dabei hatte ich
einen Quellcode-Teil aus einem der 3 Foren hier in den Profaneditor
kopiert. Nur war das kein Code zwischen den Code-Tags, sondern
auf der Website als HTML-Text.Da wunderte es mich auch, daß ich einen solchen Fehler bekam,
obwohl die Schleifenkörper richtig in meinem Quellcode standen.
Nach ewigem Suchen hatte ich dann festgestellt, daß die Leerzeichen
vor dem Code (wegen Einrückung) gar keine richtigen Leerzeichen waren
und somit der Interpreter den Befehl / EndWhile gar nicht erkannte.Erst eine Nachbearbeitung mit dem Profaneditor (mit Backspace und
Einrücken mit der Leertaste) brachte den Erfolg.Ist nur mal als Hinweis. Man kann ja sämtliche Möglichkeiten in
Betracht ziehen.Danke für den Hinweis. Der Code ist komplett von mir und ich benutze keine Einrückungen, also fällt das schonmal flach. Mein neuester Test hat was ganz kurioses ergeben:
Ich hab ja von whileloop auf For umgestellt. Das macht im Prinzip auch keinen Unterschied, die Fehlermeldung kam wieder. Kurioserweise ist meine Variable auf loop2&, die in der Funktion mit der For-Schleife definiert ist (und auch nur dort) beim Wert 15578 stehen geblieben. Dabei ist die Schleife nachweislich mehr als 49000 Mal durchlaufen worden. Da der Wert korrupt war wurde auch immer wieder versucht die gleiche Datei zu übertragen (die, mit der Nummer loop&). Irgendwann ist die Schleife dann verlassen worden (kein Break) und die Fehlermeldung kam beim 2. For (äußere Schleife). Das kann ich mir wirklich nicht erklären, vor allem nicht, dass die Variable der For-Schleife plötzlich "hängt". -
Ist loop2& bei dir mehrmals in Verwendung?
Wo wird die Variable declariert? Global oder lokal? -
Ist loop2& bei dir mehrmals in Verwendung?
Wo wird die Variable declariert? Global oder lokal?Lokal deklariert und nur in der Schleife verwendet. Nur ausgelesen (von FOR mal abgesehen). Die äußere Schleife nutzt eine Variable namens loop1&.
-
Warum benutzt du denn nicht die Systemvariable &LOOP ?
Roland hat das schon vor längerer Zeit korrigiert, damit
es auch in ineinander geschachtelten WhileLoop - Schleifen
funktioniert bzw. &LOOP den richtigen Schleifenwert hat. -
Warum benutzt du denn nicht die Systemvariable &LOOP ?
Roland hat das schon vor längerer Zeit korrigiert, damit
es auch in ineinander geschachtelten WhileLoop - Schleifen
funktioniert bzw. &LOOP den richtigen Schleifenwert hat.Damit hatte es angefangen. Das Problem besteht da auch unverändert.
-
So, erneut getestet und wieder erhöht sich der Wert der For-Variable nicht mehr (diesmal bei ~5800). Ich habs wieder in WhileLoop geändert und lasse es jetzt erneut laufen...
-
Wird im Programm irgendeinr Art von Callback ausgeführt, während die Schleife läuft?
-
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!