Hängt sich auf bei *Riesenloop"

Previous topic - Next topic

monono

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:
Code (glbasic) Select

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!

Kitty Hello

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]

monono

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"  :)

Schranz0r

SHOWSCREEN macht die Schleife um ein VIELFACHES langsamer!
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Kitty Hello

Wenn Du das Feld vorher mit DIM[10000] und dann redim[0] machst, sollte es auch schnell gehen, der Speicher bleibt dann alloziiert.

D2O

Öhmmm ,
muss das
Code (glbasic) Select
WHILE NOT ENDOFFILE(1)
nicht
Code (glbasic) Select
WHILE NOT ENDOFFILE(1) = 1

heisen??
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Kitty Hello


monono

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?

Kitty Hello

LIMITFPS -1
und Showscreen nur alle 1000 Zeilen.

monono

Funktioniert jetzt doch. Hatte eigendlich genau das getestet und es ging nicht. Schön das wir eine Lösung haben.