Seite 2 von 3

Re: Fenster schwarz nach Standby

Verfasst: 28.01.2022 20:43
von Re42
Mittlerweile weiß ich, warum das Fenster schwarz blieb. Der Code enthält ein finales FlipBuffers(), was zunächst am Ende weiter flippte. Danach habe ich nur noch ein einziges Mal flippen lassen. Und dann kam nach dem Aufwecken aus dem Energiesparmodus das Fenster mit der Programm-Oberfläche zurück. So wie es soll. Aber dann gleich beim Drücken des Start-Buttons (mein Programm) wurde das Fenster - schwarz. Es wurde ja schließlich dann auch wieder erneut FlipBuffers() abgearbeitet. Wie kommt man denn dann aus dem Dilemma raus?

1. Energiesparmodus abschalten, ha ha.
2. ?
3. ?

Von mir aus kann mein Programm nach dem Wiederaufwecken aus dem Energiesparmodus heraus wieder genauso aussehen wie frisch zum Start, Hauptsache ich werde das schwarze Fenster los.

Den Code oder Teile davon kann ich jetzt hier vom Handy aus leider nicht einstellen, für generelle Tipps wäre ich aber dankbar.

Noch eine zusätzliche Frage: Gibt es evtl. irgendwo eine Liste, wo man einsehen kann, zu weichem Event was gehört? Also z.B. 512 für Maus-Bewegung usw.? Danke.

Re: Fenster schwarz nach Standby

Verfasst: 28.01.2022 21:56
von HeX0R
Ich kann Dir bei Deinem Problem leider nicht helfen, weil ich Deiner Erklärung überhaupt nicht folgen kann.
Aber was die Events (unter Windows zumindest) betrifft, schau mal da:
viewtopic.php?f=8&t=14974

Re: Fenster schwarz nach Standby

Verfasst: 28.01.2022 23:12
von Re42
Danke, aber diese Seite kannte ich schon. Hat mir auch etwas geholfen, aber Events wie 800 oder gar 49299 tauchen da nicht auf. In meinem Code taucht auch Event 30 auf, obwohl der mit Time Change überhaupt nichts zu tun hat. Da läuft nur ein Cursor, der über ElapsedMilliseconds() gesteuert wird. Daß man überhaupt Probleme bekommt mit dem Energiesparmodus, ist in meinen Augen ein Windows-Armutszeugnis. Ich habe aber immerhin einen Kompromiß gefunden, mit Mausklick und Taste ESC mein Programm in den Grundzustand zurückversetzen zu können. Man darf ja dann erstmal auf das Fenster klicken, nichtmal der Fokus bleibt dem Fenster erhalten, wenn der Energiesparmodus kommt, eine Sauerei ist das. In meinem täglichen Leben begrüße ich Energie sparen sehr, aber so wie Windows das präsentiert, nicht.

Re: Fenster schwarz nach Standby

Verfasst: 28.01.2022 23:21
von HeX0R
Also Windows grundsätzlich zu verfluchen finde ich etwas voreilig.
Das Beispiel der PB Hilfe zeigt ja schon, dass der Energiesparmodus per se, gar keinen Einfluss hat.
Du machst da irgendwas anders, und vermutlich ist da auch der Hund begraben.
Aber solange genau das keiner sieht, wird Dir auch keiner helfen können.

Re: Fenster schwarz nach Standby

Verfasst: 29.01.2022 00:18
von Re42
Windows verfluchen tue ich nicht, aber etwas Kritik darf ja sein. Meinen Code hatte ich vom Aufbau her in der Tat geändert, und zwar genau so, wie das für WindowedScreen() beschrieben wird. Das Energiesparmodus-Problem war dadurch aber nicht gelöst worden. Es gibt aber auch noch etwas weiteres, was mysteriös ist: Wenn ich die Event-Abfrage so mache, daß nur Events abgefragt werden, die größer als 0 sind, läuft Event 13104 genau einmal auf und weiter geht's. Wenn ich allerdings die Abfrage mit Repeat ... Until event=0 mache, läuft Event 13104 immer weiter auf, ein graues Fenster erscheint und da drauf dann der blaue Warte-Kringel. Das geht dann immer so weiter. Mein Code läuft wirklich gut, nur die Sache mit dem Energiesparmodus gibt mir Rätsel auf.

Mit fällt da jetzt nur noch ein, was wohl passieren würde, wenn man WindowedScreen komplett neu starten könnte, eben wie das beim Starten des Programms ja auch passiert. Aber einen #PB_Event_CloseWindowedScreen gibt es nicht,
was evtl. ja auch gute Gründe hat.

Ich werde morgen noch eine weitere Untersuchung machen und dann evtl. mal Code-Teile hier einstellen. Aber was? Der Konflikt hat mit FlipBuffers() zu tun und darauf kann ich nicht verzichten. Danke nochmals.

Re: Fenster schwarz nach Standby

Verfasst: 29.01.2022 03:40
von mk-soft
Siehe PB Hilfe WindowEvent()

So sollte der Loop aussehen

Code: Alles auswählen

;Hauptschleife
Repeat 
  
  Repeat
    ;Fenster-Ereignisse
    ;====================================
    ;Versuche alle Möglichkeiten, aber nur eine zu einem Zeitpunkt
    Event = WindowEvent()    ; Animation
                             ; Event = WaitWindowEvent()  ; Animation wird blockiert
                             ; Event = WaitWindowEvent(1) ; Animation, aber einer 1ms langen unnötigen Verzögerung; und darüber hinaus ist es ein
                             ; schlechter Weg, um Ereignisse zu programmieren, weil die Warteschlange nicht leer ist
    
    Select Event   
      Case #PB_Event_CloseWindow
        End
    EndSelect 
  Until Event=0
  
  FlipBuffers() ; ==> Mit WindowEvent(), FlipBuffers() gibt die CPU für das Multitasking frei, so dass Delay(1)
                ;     nicht erforderlich ist.
  ClearScreen(RGB(135, 206, 235))
  
  ExamineKeyboard() ;Keyboard
  
  ; DisplaySprite(...) ;Anzeige des Sprites
  ; etc
  
Until KeyboardPushed(#PB_Key_Escape)
Sonst Kringel (o)

Re: Fenster schwarz nach Standby

Verfasst: 29.01.2022 09:40
von Re42
Da gibt es in der Tat Abweichungen von dem, was ich gemacht habe und da dämmert mir jetzt etwas. Ich werde das heute noch bearbeiten und melde mich dann später nochmal. Danke erstmal!

Re: Fenster schwarz nach Standby

Verfasst: 29.01.2022 11:35
von Re42
Mittlerweile hatte ich die Event-Abfrage so verändert, wie das in der PureBasic-Hilfe drin steht, allerdings ist es nach wie vor nicht möglich, die Eventabfrage mit Repeat ... Until event = 0 zu machen, weil dann wieder der blaue Wartekringel kommt. Man kann die Abfrage ja aber auch so verändern, daß nur Events abgefragt werden, die größer als 0 sind, das klappt gut. Debugge ich dagegen jeden Event, dann ist die Reihenfolge 13104, 13115, 0 usw.

Der Aufbau meines Codes sieht jetzt so aus:

Code: Alles auswählen


Init-Befehle für Sprites, Keyboard, Maus, Sound

LoadSound()

Procedure() (zum Töne abspielen)

If OpenWindow()
  If OpenWindowedScreen()
  
  Sprites ladan

  StartDrawing(Screenoutput))
    Linien, Boxen, was halt gebraucht wird als Fensterinhalt
  StopDrawing()

  Diverse DIMs

 Repeat
  event = WindowEvent() ; eigentlich WaitW.. mit timeout
  If event > 0
     Select event
     Case #PB_Event_LeftClick
      .....
     EndSelect()
  EndIf

    FlipBuffers()
    (ClearScreen()) 
    ExemineKeyboard()
    
    TransparentSpriteColor()
    DisplayTransparentSprites 

    ;Der restliche Code

    ......

  Until event = #PB_Event _CloseWindow  
Endif
Endif

Mir ist klar, daß nach der Rückkehr aus dem Energiesparmodus mein Code ja immernoch die Repeat-Schleife durchläuft und dann natürlich Zeichenelemente wie Linien, Boxen usw. nicht nochmal gezeichnet werden können nach der Rückkehr aus dem Energiesparmodus, insofern muß ich mich für mein gestriges Meckern über Windows nun teilweise entschuldigen. Mein Programm ist allerdings kein Programm mit Animationen, sondern da gibt es eine feste Oberfläche, wo sich allenfalls Farben verändern, aber vor allem werden da Musiknoten erzeugt. So, und wenn ich dann ClearScreen() anlege, sind die Noten natürlich alle weg. Und genau das selbe passiert natürlich auch dann, wenn ich bei jedem Repeat das Fenster neu zeichnen lasse. Und jetzt?

Mir würde es völlig reichen, wenn nach dem Wiederaufwecken aus dem Energiesparmodus die Programmoberfläche wieder so aussieht, als wäre das Programm frisch gestartet. Hauptsache ich sehe dann wieder die Programmoberfläche und kann weiter normal damit arbeiten, ohne daß dann ein schwarzes Fenster kommt wegen FlipBuffers(). Die Programmoberfläche darf also nur dann neu gezeichnet werden, wenn der Energiesparmodus einsetzt oder beendet wird. Aber dazu muß ja dann irgendwie in der Eventabfrage erkannt werden, daß genau das passiert! Welche Event-Nummern laufen dann auf? Und dann kann auch ClearScreen() dazu kommen. Es muß doch irgendwie möglich sein, bei meinem Programmtyp mit dem Energiesparmodus umgehen zu können. Danke für weitere Infos.

Re: Fenster schwarz nach Standby

Verfasst: 29.01.2022 13:26
von HeX0R
Was immer Du da tust, Du machst irgendwas falsch!
Welche Events da so abgefeuert werden interessiert überhaupt nicht, weil das Programm einfach weiterläuft.

Und in einem WindowedScreen muss man ständig alles neu zeichnen, daher hatte ich ja auch Canvas empfohlen, da musst Du das nur machen, wenn sich was verändert hat.

Hier ein Beispiel, wie Du siehst, läuft das nach dem Aufwecken einfach weiter, ohne dass irgendwelche Events irgendjemanden interessieren.

Code: Alles auswählen

InitSprite()
InitKeyboard()
InitMouse()

OpenWindow(0, 0, 0, 640, 480, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 640, 480)

LoadFont(0, "Arial", 14)
;Init Sprites
For i = 1 To 10
	CreateSprite(i, 120, 24, #PB_Sprite_AlphaBlending)
	If StartDrawing(SpriteOutput(i))
		RoundBox(0, 0, 120, 24, 15, 15, $DE0C30)
		DrawingFont(FontID(0))
		a$ = "Button_" + RSet(Str(i), 2, "0")
		DrawText(60 - TextWidth(a$) / 2, 12 - TextHeight(a$) / 2, a$, RGB(Random($FF, $80), Random($FF, $80), Random($FF, $80)), $DE0C30)
		StopDrawing()
	EndIf
	TransparentSpriteColor(i, 0)
Next i

Repeat 
  
  Repeat
    Select WaitWindowEvent(5)
    	Case #PB_Event_CloseWindow
    		Break 2
    	Case 0
    		Break
    EndSelect 
  ForEver
  
  FlipBuffers()

  ClearScreen(RGB(135, 206, 235))
  
  ExamineKeyboard()
  
  For i = 1 To 5
  	DisplayTransparentSprite(i, -115 + i * 125, 50)
  Next i
  For i = 6 To 10
  	DisplayTransparentSprite(i, -115 + (i - 5) * 125, 110)
  Next i
  
Until KeyboardPushed(#PB_Key_Escape)

Re: Fenster schwarz nach Standby

Verfasst: 29.01.2022 13:47
von ccode_new
Hallo,

tritt das Problem nur bei deinem "WindowedScreen"-Programm auf?

-> Oder tritt das Problem bei irgend einem beliebigen "WindowedScreen"-Programm auch auf?