Fenster schwarz nach Standby

Anfängerfragen zum Programmieren mit PureBasic.
Re42
Beiträge: 91
Registriert: 08.11.2020 23:41

Re: Fenster schwarz nach Standby

Beitrag 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.
Zuletzt geändert von Re42 am 29.01.2022 12:49, insgesamt 1-mal geändert.
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Fenster schwarz nach Standby

Beitrag 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
Re42
Beiträge: 91
Registriert: 08.11.2020 23:41

Re: Fenster schwarz nach Standby

Beitrag 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.
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Fenster schwarz nach Standby

Beitrag 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.
Re42
Beiträge: 91
Registriert: 08.11.2020 23:41

Re: Fenster schwarz nach Standby

Beitrag 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.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Fenster schwarz nach Standby

Beitrag 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)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re42
Beiträge: 91
Registriert: 08.11.2020 23:41

Re: Fenster schwarz nach Standby

Beitrag 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!
Re42
Beiträge: 91
Registriert: 08.11.2020 23:41

Re: Fenster schwarz nach Standby

Beitrag 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.
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Fenster schwarz nach Standby

Beitrag 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)
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Fenster schwarz nach Standby

Beitrag 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?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten