FlipBuffers() bleibt manchmal minutenlang hängen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Gimbly
Beiträge: 169
Registriert: 28.12.2005 14:26
Wohnort: NRW

FlipBuffers() bleibt manchmal minutenlang hängen

Beitrag von Gimbly »

Bin langsam am Verzweifeln.

Habe ein Programm mit PB 4.20 geschrieben, welches mit WindowedScreen arbeitet und möchte es eigentlich an den Kunden ausliefern. Aber das Teil hängt immer wieder, wenn man längere Zeit keine Eingaben gemacht hat. Der Taskmanager zeigt dann 100% Auslastung an (bzw. 50% bei Dual Core) und ich schieße es dann meist ab. Wenn ich aber 1-2 Minuten warte, läuft es wieder normal weiter.

Als Schuldigen habe ich jetzt FlipBuffers() ausgemacht, welches manchmal endlos lange nicht wieder zurückkehrt und alles blockiert. Was ist da los?

Selbst bei diesem ganz simplen Beispiel-Code passiert es ab und zu. Zum Testen bitte starten und Esc drücken. Dann wird FlipBuffers() aufgerufen und anschließend kommt die Frage, ob das Programm beendet werden soll. "Nein" drücken und das Prog. läuft weiter. Funktioniert soweit einwandfrei. Aber wenn man das Prog. offen lässt und im Vordergrund mit anderen Programmen arbeitet und es dann wieder nach vorne holt und Esc drückt, kommt manchmal minutenlang keine Reaktion. Die letzte Aktion, die das Prog. ausführt, ist "kurz vor FlipBuffers()" in die Zwischenablage zu schreiben und dann bleibt es mit FlipBuffers() hängen. Woran liegt das?

Code: Alles auswählen

InitSprite()
Breite=300 : Hoehe=200

OpenWindow(0,0,0,Breite,Hoehe,"Test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0,Breite,Hoehe,0,0,0)

AddKeyboardShortcut(0,#PB_Shortcut_Escape,#PB_Shortcut_Escape)

Repeat : Event=WaitWindowEvent()
  If Event=#PB_Event_Menu : Taste=EventMenu()
    If Taste=#PB_Shortcut_Escape
      SetClipboardText("kurz vor FlipBuffers()"+Chr(10)) ;letzte Aktion vor dem Hänger in Zwischenablage protokollieren
      FlipBuffers()
      SetClipboardText("nach FlipBuffers()"+Chr(10))
      If MessageRequester("", "Programm beenden?", #MB_YESNO|#MB_ICONQUESTION|#MB_DEFBUTTON2)=#IDYES
        End
      EndIf
    EndIf
  EndIf
Until Event=#PB_Event_CloseWindow
Gruß
Markus
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

spontan sehe ich, dass du WaitWindowEvent verwendest.
wenn du mit nem screen arbeitest, besser nur WindowEvent, oder am besten WaitWindowEvent(Timeout) mit einem Timeout-wert von 10-200...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Sollte flipbuffers() nicht außerhalb der if-Schleifen stehen,
also vor Event=WaitWindowEvent() oder vor Until Event = #PB_Event_CloseWindow ?
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ah... gut geblickt, scholly :allright:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Gimbly
Beiträge: 169
Registriert: 28.12.2005 14:26
Wohnort: NRW

Beitrag von Gimbly »

Danke für die schnellen Antworten, dass gibt mir Hoffnung!

@Kaeru Gaman: WindowEvent() habe ich in meinem eigentlichen Programm sogar verwendet. Hab's im Beispiel jetzt geändert.

Warum sollte FlipBuffers() außerhalb der if-Schleifen stehen?

Ist es so besser?

Code: Alles auswählen

InitSprite()
Breite=300 : Hoehe=200

OpenWindow(0,0,0,Breite,Hoehe,"Test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0,Breite,Hoehe,0,0,0)

AddKeyboardShortcut(0,#PB_Shortcut_Escape,#PB_Shortcut_Escape)

Repeat : Delay(10) : Event=WindowEvent()
  SetClipboardText("kurz vor FlipBuffers()"+Chr(10)) ;letzte Aktion vor dem Hänger in Zwischenablage protokollieren
  FlipBuffers()
  SetClipboardText("nach FlipBuffers()"+Chr(10))
  If Event=#PB_Event_Menu : Taste=EventMenu()
    If Taste=#PB_Shortcut_Escape
      If MessageRequester("", "Programm beenden?", #MB_YESNO|#MB_ICONQUESTION|#MB_DEFBUTTON2)=#IDYES
        End
      EndIf
    EndIf
  EndIf
Until Event=#PB_Event_CloseWindow
Werde das mal testen.
Gruß
Markus
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Warum sollte FlipBuffers() außerhalb der if-Schleifen stehen?
damit es IMMER ausgeführt wird.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Gimbly
Beiträge: 169
Registriert: 28.12.2005 14:26
Wohnort: NRW

Beitrag von Gimbly »

Kaeru Gaman hat geschrieben: damit es IMMER ausgeführt wird.
Aber es soll eigentlich nur ausgeführt werden, wenn eine Taste gedrückt wird (in diesem Falle Esc).
Gruß
Markus
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Gimbly hat geschrieben:Aber es soll eigentlich nur ausgeführt werden, wenn eine Taste gedrückt wird (in diesem Falle Esc).
Ich kann den Sinn dahinter leider nicht verstehen.
Vielleicht hilfts, wenn Du etwas erläuterst...
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Gimbly
Beiträge: 169
Registriert: 28.12.2005 14:26
Wohnort: NRW

Beitrag von Gimbly »

Der Sinn ist, dass als Reaktion auf den Tastendruck auf dem Screen etwas angezeigt werden soll. Habe das Beispiel mal entsprechend modifiziert. Auf dem Screen erscheint jetzt eine Sekunde lang "Esc gedrückt".

Code: Alles auswählen

InitSprite()
Breite=300 : Hoehe=200

OpenWindow(0,0,0,Breite,Hoehe,"Test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0,Breite,Hoehe,0,0,0)

AddKeyboardShortcut(0,#PB_Shortcut_Escape,#PB_Shortcut_Escape)

Repeat : Delay(10) : Event=WindowEvent()
  If Event=#PB_Event_Menu : Taste=EventMenu()
    If Taste=#PB_Shortcut_Escape
      StartDrawing(ScreenOutput())
      DrawText(10,10,"Esc gedrückt")
      StopDrawing()
      SetClipboardText("kurz vor FlipBuffers()"+Chr(10)) ;letzte Aktion vor dem Hänger in Zwischenablage protokollieren
      FlipBuffers()
      SetClipboardText("nach FlipBuffers()"+Chr(10))
      Delay(1000)
      StartDrawing(ScreenOutput())
      Box(10,10,100,20) ;Schrift wieder weg 
      StopDrawing()
      FlipBuffers()
    EndIf
  EndIf
Until Event=#PB_Event_CloseWindow
Zuletzt geändert von Gimbly am 30.03.2008 20:25, insgesamt 2-mal geändert.
Gruß
Markus
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Sorry, ich versteh es immer noch nich :oops:

Zum Textanzeigen brauchste doch keinen WindowedScreen.
Was passiert denn wirklich da, daß Du einen brauchst ?

Vielleicht ist ja Dein Ansatz mitm WindowedScreen nicht so das gelbe vom Ei...
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Antworten