Hallo zusammen,
Wenn ich eine Schleife sehr oft ausführen will, führt das in einigen Fällen dazu, dass sich das Programm für kurze Zeit nicht zurückmeldet ("Keine Rückmeldung" im Taskmanager).
Das passiert nur in den Schleifen die eine sehr viele Durchläufe haben und wenig dabei tun.
Aktuelles Beispiel ist aus einem Nachbau einer meiner Blitz Projekte:
DIM alist$[0]
OPENFILE(1, "media/a-wordgeo.txt", TRUE)
WHILE NOT ENDOFFILE(1)
LOCAL a$
READLINE 1, a$
DIMPUSH alist$[], a$
WEND
CLOSEFILE 1
INPUT in$ ,100,100
FOREACH b IN alist$[]
IF in$ = b THEN PRINT "got it!", 100,100
NEXT
SHOWSCREEN
KEYWAIT
Die Datei beinhaltet ca. 30 000 Worte, je eins pro Zeile. Der Originalcode hatte solche Probleme nicht. Ist das ein GLB internes Problem, gibt es irgendwelche workarounds?
Wie gesagt passiert das auch in anderen Schleifen, aber niemals wenn z.B. ein print + showscreen dazwischen steht.
Bin für Hinweise sehr dankbar!
mach alle 1000 Objekte ein Showscreen rein.
Schau mal, wo er langsam ist - mach optional das dimpush mal raus. Evtl. hilft's was das array vorher so zu machen:
DIM alist$[100000]
REDIM alist$[0]
Es ist auf jeden Fall das REDIM in DIMPUSH. Mit fester Feldgröße ist er gefühlte 100x schneller und ohne hängen, egal ob ich noch ein BOUNDS davor mache. Deine beiden Ideen gehen leider nicht auf. SHOWSCREEN funktioniert alle 100, bleibt aber langsam.
Sonst mache ich einfach einen Zähler in die erste Zeile der Datei. Ich werde nicht in die Verlegenheit kommen unbekannte Dateien einzulesen. Kannst es ja auf deine TODO Liste schreiben: "DIMPUSH schneller machen" :)
SHOWSCREEN macht die Schleife um ein VIELFACHES langsamer!
Wenn Du das Feld vorher mit DIM[10000] und dann redim[0] machst, sollte es auch schnell gehen, der Speicher bleibt dann alloziiert.
Öhmmm ,
muss das WHILE NOT ENDOFFILE(1)
nicht
WHILE NOT ENDOFFILE(1) = 1
heisen??
IF NOT a heisst wenn a=0
Also, der DIM -> REDIM Trick funktioniert bei mir einfach nicht. Für mein aktuelles Problem ist die Sache durch ein Index gelöst. An sich ist das ganze natürlich blöd. GLB macht ja nichts falsch, es meldet sich nur nicht. Gibt es nicht so eine Art Minimalrückmeldung die nicht so ausbremst wie SHOWSCREEN?
LIMITFPS -1
und Showscreen nur alle 1000 Zeilen.
Funktioniert jetzt doch. Hatte eigendlich genau das getestet und es ging nicht. Schön das wir eine Lösung haben.