For-Schleifen zwischen Repeat/Until -> Programmabsturz

Anfängerfragen zum Programmieren mit PureBasic.
Gamer
Beiträge: 180
Registriert: 21.03.2005 16:59

For-Schleifen zwischen Repeat/Until -> Programmabsturz

Beitrag 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
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

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

Beitrag 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.
Zuletzt geändert von traumatic am 24.03.2005 15:36, insgesamt 1-mal geändert.
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

Lass das Converten als Thread laufen oder bau die Event Behandlung zusäztzlich noch mit in dein For ein :)
Bild
BildDas ist Tux. Kopiere Tux in deine Signatur und hilf ihm so auf seinem Weg zur Weltherrschaft.
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag 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
Gamer
Beiträge: 180
Registriert: 21.03.2005 16:59

Beitrag von Gamer »

Reicht nun WindowEvent() in der For-Schleife?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Code: Alles auswählen

While WindowEvent() : Wend
sollte reichen
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag 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.
Bild
BildDas ist Tux. Kopiere Tux in deine Signatur und hilf ihm so auf seinem Weg zur Weltherrschaft.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten