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.
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
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