Seite 1 von 1

For-Schleifen zwischen Repeat/Until -> Programmabsturz

Verfasst: 24.03.2005 15:25
von Gamer
Wenn die For-Schleife abläuft, wird logischerweise alles andere
zwischen Repeat und Until nicht bearbeitet.

Aber wieso gilt das auch für den Exit-Button?

Ebenso wenn ein anderes Anwendungsfenster vor dem Programm war,
ist die Darstellung teilweise fehlerhaft, es wird nicht aktualisiert.

Außerdem schmiert das Programm bei langandauernden Schleifen ab (z.B. Konvertierung von 200 Bildern).

Woran liegt das und was kann man dagegen machen?

Code: Alles auswählen

Repeat

EventID = WaitWindowEvent()

For i to irgendwas
; bildkonvertierung
next

Until EventID = #PB_Event_CloseWindow

Re: For-Schleifen zwischen Repeat/Until -> Programmabstur

Verfasst: 24.03.2005 15:33
von traumatic
Gamer hat geschrieben:Wenn die For-Schleife abläuft, wird logischerweise alles andere
zwischen Repeat und Until nicht bearbeitet.

Aber wieso gilt das auch für den Exit-Button?
Eben genau deshalb ;)
Gamer hat geschrieben:Wenn die For-Schleife abläuft, wird logischerweise alles andere
zwischen Repeat und Until nicht bearbeitet.
Da während des Schleifendurchlaufs in Deinem Code-Beispiel kein Eventhandling
stattfindet, kann auch nicht auf Eingaben reagiert werden.
Ebenso wenn ein anderes Anwendungsfenster vor dem Programm war,
ist die Darstellung teilweise fehlerhaft, es wird nicht aktualisiert.
Aus dem selben Grund.
Außerdem schmiert das Programm bei langandauernden Schleifen ab (z.B. Konvertierung von 200 Bildern).
Ich schätze mal, das Programm "schmiert" nicht wirklich "ab" - es reagiert
einfach nicht mehr auf Eingaben, deshalb "sieht es so aus".
Woran liegt das und was kann man dagegen machen?
z.B.

Code: Alles auswählen

While WindowEvent() : Wend
Im FAQ-Bereich dieses Forums gibt es ein paar Erklärungen zum Thema
Windows-Messagehandling:
http://forums.purebasic.com/german/viewtopic.php?t=23

Im PureBasic-Helpfile ist die Thematik auch angesprochen, vielleicht dort
einfach nochmal nachlesen.

Verfasst: 24.03.2005 15:35
von 125
Lass das Converten als Thread laufen oder bau die Event Behandlung zusäztzlich noch mit in dein For ein :)

Verfasst: 24.03.2005 15:40
von Leo
Du solltest dann wohl das Eventbehandlen in ein Callback pushen

Code: Alles auswählen

Procedure Callback(wnd.l,msg.l,lprm.l,wprm.l)
    ret = DefWindowProc_(wnd,msg,lprm,wprm)
    Select msg
        Case #WM_QUIT 
            End 
    EndSelect
    ProcedureReturn ret
EndProcedure

OpenWindow(0,0,0,640,480,#PB_Window_ScreenCentered|#PB_Window_SystemMenu,"Fenster")
SetWindowCallback(@Callback())

Repeat
    Event = WindowEvent()
    For I = 0 To 100000000
        ;Ganz laaaange schleife :D
        I - 1
        Delay(10)
        WindowEvent()
    Next
Until Event = #PB_Event_CloseWindow

Verfasst: 24.03.2005 15:49
von Gamer
Reicht nun WindowEvent() in der For-Schleife?

Verfasst: 24.03.2005 15:54
von ts-soft

Code: Alles auswählen

While WindowEvent() : Wend
sollte reichen

Verfasst: 24.03.2005 16:16
von 125
Gamer hat geschrieben:Reicht nun WindowEvent() in der For-Schleife?
Ja aber dann reagiert er auf keine Klicks ins Window etc. Wenn deine User weiterarebeiten können sollen muss die restliche eventschleife auch rein oder das for als thread runnen.

Verfasst: 24.03.2005 16:27
von ts-soft
die Button-Abfrage machtste in ein WindowsCallback (gibts viele Beispiele im CodeArchiv) und in Deiner For Schleife fügste ein: While WindowEvent() : Wend