Author Topic: Hängt sich auf bei *Riesenloop"  (Read 3283 times)

Offline monono

  • Mr. Polyvector
  • ***
  • Posts: 213
    • View Profile
    • Sockel Lernmedien
Hängt sich auf bei *Riesenloop"
« 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!

Offline Kitty Hello

  • code monkey
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 10817
  • here on my island the sea says 'hello'
    • View Profile
    • http://www.glbasic.com
Re: Hängt sich auf bei *Riesenloop"
« Reply #1 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]

Offline monono

  • Mr. Polyvector
  • ***
  • Posts: 213
    • View Profile
    • Sockel Lernmedien
Re: Hängt sich auf bei *Riesenloop"
« Reply #2 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"  :)

Offline Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5111
  • O Rly?
    • View Profile
Re: Hängt sich auf bei *Riesenloop"
« Reply #3 on: 2010-Sep-13 »
SHOWSCREEN macht die Schleife um ein VIELFACHES langsamer!
I <3 DGArray's :D

PC:
AMD Ryzen 7 1700 @3.9GHz, 16GB HyperX Fury 3000MHz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard

Offline Kitty Hello

  • code monkey
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 10817
  • here on my island the sea says 'hello'
    • View Profile
    • http://www.glbasic.com
Re: Hängt sich auf bei *Riesenloop"
« Reply #4 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.

Offline D2O

  • Prof. Inline
  • *****
  • Posts: 1071
    • View Profile
    • http://www.deuteriumoxid.com
Re: Hängt sich auf bei *Riesenloop"
« Reply #5 on: 2010-Sep-14 »
Ö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

Offline Kitty Hello

  • code monkey
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 10817
  • here on my island the sea says 'hello'
    • View Profile
    • http://www.glbasic.com
Re: Hängt sich auf bei *Riesenloop"
« Reply #6 on: 2010-Sep-14 »
IF NOT a heisst wenn a=0

Offline monono

  • Mr. Polyvector
  • ***
  • Posts: 213
    • View Profile
    • Sockel Lernmedien
Re: Hängt sich auf bei *Riesenloop"
« Reply #7 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?

Offline Kitty Hello

  • code monkey
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 10817
  • here on my island the sea says 'hello'
    • View Profile
    • http://www.glbasic.com
Re: Hängt sich auf bei *Riesenloop"
« Reply #8 on: 2010-Sep-15 »
LIMITFPS -1
und Showscreen nur alle 1000 Zeilen.

Offline monono

  • Mr. Polyvector
  • ***
  • Posts: 213
    • View Profile
    • Sockel Lernmedien
Re: Hängt sich auf bei *Riesenloop"
« Reply #9 on: 2010-Sep-15 »
Funktioniert jetzt doch. Hatte eigendlich genau das getestet und es ging nicht. Schön das wir eine Lösung haben.