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

Beitrag von Gimbly »

Das war's leider nicht. Mit WaitWindowEvent(10) hängt es irgendwann auch. :cry:

Wäre vom Programmablauf (des Beispielcodes) auch nicht logisch. Denn wenn sich da Events aufgestaut hätten, würden die in der Repeat-Schleife blitzschnell abgearbeitet, egal ob WaitWindowEvent() oder WaitWindowEvent(10).

Dass der Esc-Tastendruck noch korrekt erkannt wird, sieht man eindeutig daran, dass danach in der Zwischenablage "kurz vor FlipBuffers()" steht (Bitte mal in einem Editor Strg-C drücken). Wenn Esc nicht erkannt würde, weil andere Event vorher blockieren, müßte in der Zwischenablage "nach FlipBuffers()" stehen, weil das beim vorletzten Esc-Druck (als das Prog. noch nicht hing) dort als letztes reingeschrieben wurde.

Der Hänger liegt definitiv bei FlipBuffers(), weil der WindowedScreen() nicht mehr reagiert.

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(10)
  If Event=#PB_Event_Menu : Taste=EventMenu()
    If Taste=#PB_Shortcut_Escape
      SetClipboardText("kurz vor FlipBuffers()"+Chr(10)) ;letzte Aktion vor dem Hänger
      FlipBuffers() ;<================ hier hängt es
      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

End
Das Ganze übrigens unter Windows.
Gruß
Markus
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ermn...

da steht dein flipbuffers aber immer noch innerhalb der beiden Ifs.
würdest du bitte erstmal das offensichtlich falsche korrigieren?
dann können wir weiter reden wo vielleicht irgendwelche hänger vorlkommen,
dann kann ich das auch mal testen.
aber ein definitiv auf den ersten blick fehlerhaftes programm brauch ich auch nicht testen.
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 »

Wo bitte steht, dass FlipBuffers() nicht in einem if-Block stehen darf?
Gruß
Markus
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 »

Gimbly hat geschrieben:Wo bitte steht, dass FlipBuffers() nicht in einem if-Block stehen darf?
FlipBuffers() muß in regelmässigen abständen ausgeführt werden,
nicht nur wenn eine Bedingung zutrifft. Das muß nicht extra erwähnt
werden, das ist einfach logisch :mrgreen:
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
Gimbly
Beiträge: 169
Registriert: 28.12.2005 14:26
Wohnort: NRW

Beitrag von Gimbly »

Auch, wenn nichts auf dem Schirm geändert wurde?
Gruß
Markus
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

nein, nicht unbedingt.
aber so wie es jetzt ist, wird nur geflippt wenn man ESC drückt, und so kann man doch nicht testen, ob das flipping hängenbleibt.
wie oft soll ich denn escape drücken...?

davon ab würde ich wenn du eh schon nen screen hast, die Keyboard-lib verwenden und nicht den shortcut.
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 »

Ist dass denn sooo schwer? Du sollst das Prog. starten, dann einmal oder auch mehrmals Esc drücken und die Frage mit Nein beantworten. Ein Blick in den Code zeigt dir, was genau dabei passiert. Dann schickst du das Prog in den Hintergrund, indem du einfach mit anderen Programmen arbeitest, z.B. dem Browser. Nach etwa 10 Minuten holst Du das Prog. wieder nach vorn und drückst dann einmal Esc und es passiert gar nichts. Wenn doch, schick es nochmals in den Hintergrund und teste nach weiteren 10 Minuten wieder.

Edit:
Inzwischen bin ich mir allerdings sicher, dass FlipBuffers() tatsächlich regelmäßig aufgerufen werden muss, auch wenn auf dem Screen gar nichts passiert, weil der Screen sonst scheinbar einpennt.
Gruß
Markus
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Ist dass denn sooo schwer?
so wie es jetzt ist, ist es definitiv falsch, also brauch ichs auch nicht testen.

> weil der Screen sonst scheinbar einpennt.
kann ich mir nicht vorstellen. muss wo anders dran liegen.
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 »

OK, Kaeru Gaman, nichts für ungut. Hauptsache ich habe eine Lösung gefunden, nämlich die, FlipBuffers() tatsächlich regelmäßig aufzurufen, auch wenn auf dem Schirm nichts passiert.

Danke an alle Beteiligten, auch wenn sie mich manchmal wie einen Vollidioten behandelt haben. :D
Zuletzt geändert von Gimbly am 31.03.2008 14:19, insgesamt 1-mal geändert.
Gruß
Markus
xperience2003
Beiträge: 972
Registriert: 04.10.2004 18:42
Computerausstattung: Amiga, LinuxMint, Windows7
Wohnort: gotha
Kontaktdaten:

Beitrag von xperience2003 »

if demotimer<300
male was
flipbuffers()
endif

geht einwandfrei
hoere das mit dem schleifen zeug zum ersten mal

hatte mal nen tool gebaut mit sprites im windowed screen
auch da wird nur geflipped, wenn etwas neues im screen ist
ansonsten suckt es performance ohne ende
amiga rulez...
Rebirth Software
Antworten