GLBasic forum

Other languages => GLBasic - de => Topic started by: monono on 2010-Sep-13

Title: Hängt sich auf bei *Riesenloop"
Post by: monono on 2010-Sep-13
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!
Title: Re: Hängt sich auf bei *Riesenloop"
Post by: Kitty Hello on 2010-Sep-13
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]
Title: Re: Hängt sich auf bei *Riesenloop"
Post by: monono on 2010-Sep-13
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"  :)
Title: Re: Hängt sich auf bei *Riesenloop"
Post by: Schranz0r on 2010-Sep-13
SHOWSCREEN macht die Schleife um ein VIELFACHES langsamer!
Title: Re: Hängt sich auf bei *Riesenloop"
Post by: Kitty Hello on 2010-Sep-13
Wenn Du das Feld vorher mit DIM[10000] und dann redim[0] machst, sollte es auch schnell gehen, der Speicher bleibt dann alloziiert.
Title: Re: Hängt sich auf bei *Riesenloop"
Post by: D2O on 2010-Sep-14
Öhmmm ,
muss das
Code (glbasic) Select
WHILE NOT ENDOFFILE(1)
nicht
Code (glbasic) Select
WHILE NOT ENDOFFILE(1) = 1

heisen??
Title: Re: Hängt sich auf bei *Riesenloop"
Post by: Kitty Hello on 2010-Sep-14
IF NOT a heisst wenn a=0
Title: Re: Hängt sich auf bei *Riesenloop"
Post by: monono on 2010-Sep-15
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?
Title: Re: Hängt sich auf bei *Riesenloop"
Post by: Kitty Hello on 2010-Sep-15
LIMITFPS -1
und Showscreen nur alle 1000 Zeilen.
Title: Re: Hängt sich auf bei *Riesenloop"
Post by: monono on 2010-Sep-15
Funktioniert jetzt doch. Hatte eigendlich genau das getestet und es ging nicht. Schön das wir eine Lösung haben.