Seite 1 von 2

FlipBuffers(): [ERROR] Invalid Memory Access.

Verfasst: 28.03.2007 19:11
von Vermilion
Mein Code ist in ungefähr so aufgebaut:

Code: Alles auswählen

Repeat

  If IsScreenActive()
  
    ; Programmcode
  
  EndIf

  FlipBuffers()

ForEver
Wenn ich nun den Screen minimiere und wieder maximiere stürzt das Programm ab.

Wodran kann es liegen, dass FlipBuffers() einen Invalid Memory Access erzeugt? Als fertiges Executable heißt es nur wieder "Dingsda.exe" hat ein Problem festgestellt, und muss beendet werden."

Verfasst: 28.03.2007 19:23
von Kaeru Gaman
mal ganz spontan ohne testen:

FlipBuffers() würde ich nur probieren, wenn der screen aktiv ist, also mit in das IF reinsetzen....

IsScreenActive()

Verfasst: 28.03.2007 19:27
von Vermilion
In der Hilfe stand ja, dass der IsScreenActive() Befehl von FlipBuffers() verwaltet wird. Ich will ja die Anwendung anhalten wenn der Bildschirm minimiert ist. Und ob der Bildschirm immer noch minimiert ist, finde ich nur mit FlipBuffers() heraus. Bzw. IsScreenActive(), aber dazu muss ich ja FlipBuffers() ausführen.

Mir würde es auch reichen, wenn das Programm normal minimiert weiterlaufen würde, nur meldet mir dann der Compiler dass z.B. bei 2D Drawing Optionen der ScreenOutput ungültig wäre.

Verfasst: 28.03.2007 19:31
von AND51
1.) Entweder FlipBuffers() in die If-Abfrage reinpacken
2.) While Not IsScreenActive() : Wend - Hält die Programmausführung an, bis man wieder einsteigt, dies kommt einer Pause-Funktion gleich

//Edit: Wir haben gleichzeitig eine Nachricht geschrieben, deshalb konnte ich das vorher nicht wissen:
> Ich möchte das Programm solange anhalten
Dann nimm Variante 2!

Verfasst: 28.03.2007 19:47
von Vermilion
Das geht ja auch nicht, dann maximiert er nicht mehr, da durch FlipBuffers() nicht mehr überprüft wird, ob der Screen wieder maximiert wird. Zumindest kommt des Prog dann net mehr aus der Taskleiste hoch... :cry:

Verfasst: 28.03.2007 19:58
von nco2k
hmm also der code stürzt bei mir nicht ab, wenn ich min+max. :?

Code: Alles auswählen

If InitSprite() And OpenScreen(800, 600, 16, "Test")
  Repeat
    If IsScreenActive()
      ClearScreen(RGB(128, 0, 0))
    EndIf
    FlipBuffers()
  Until GetAsyncKeyState_(#VK_ESCAPE)
EndIf : End
c ya,
nco2k

Verfasst: 28.03.2007 20:03
von Thalius
Bau dir nen Minimal Loop für sowas.

jedoch verstehe ich nicht ganz warum du ein Flipbuffers brauchst ( welches ja für die Anzeige gedacht ist ) wenn dein Fenster minimiert ist ? ;)

Klar du willst das dein Spiel weiterläuft - aber überleg dir mal was du dazu brauchst ... ;)

Kleiner Tip:

In der Regel verwendet man mindestens 2 Loops ( Klar geht auch mit einem aber das ganze aufzusplitten macht schon sinn )

1: - Mainloop
2: - Drawingloop
3: - Input / Processingloop

Entweder verwendest du dafür Threads ( diese können auch unterschiedlich schnell durchlaufen , sind aber schwerer zu Handhaben ).
Oder du baust dir eine kleine Art Eventsystem welches merkt wenn das Fenster minimiert ist und dann währenddessen nicht versucht alles neuzuzeichnen .. macht eh keinen sinn... ;) und zb im Hintergrund deine Sprites bewegt, game pausiert, daten updated ..was auch immer...

Generell solltest du alle Eingaben respektive Rückgaben solcher Funktionen überprüfen um a. ein stabiles Programm schreiben zu können und b. zum leichter Debuggen.

zb.

Code: Alles auswählen

if openscreen() ..... etc.
Als Tip : Dort wo du Variablen überprüfen musst reicht ein :

Code: Alles auswählen

IF var 
...
ENDIF
anstelle eines

Code: Alles auswählen

IF var = 0
...
ENDIF
Die erste methode ist einiges shcneller zb. da nurnoch Boolisch geprüft wird und keine AND / Expression Operation mehr gemacht wird. geht natürlich nicht überall, jedoch bei Funktionen die du oft in einem Loop aufrufst solltest du drauf achten möglichst effektiv mit den ressourcen umzugehen.

Thalius

Verfasst: 28.03.2007 20:06
von THEEX
@nco2k
Dein Code würde auch nicht ohne IsScreenActive() abstürzen, die Gefahr besteht erst, wenn man StartDrawing() verwendet, nichteinmal, wenn man Sprites benutzt. Hab hier auch mal ein Beispiel:

Code: Alles auswählen

If InitSprite() And InitKeyboard()
  If OpenScreen(640, 480, 32, "")
    CreateSprite(0, 128, 128)
    StartDrawing(SpriteOutput(0))
      DrawText(0, 0, "Sprite", $FFFFFF, $000000)
    StopDrawing()
  Else
    MessageRequester("Fehler Screen", "Vollbild kann nicht dargestellt werden."): End
  EndIf
Else
  MessageRequester("Fehler Screen", "DirectX nicht aktuell."): End  
EndIf

Repeat
  FlipBuffers()
  
  If IsScreenActive()
    ExamineKeyboard()
    If Left(KeyboardInkey(), 1) = Chr(27)
      End
    EndIf
    
    ClearScreen($000000)
    
    DisplaySprite(0, 200, 200)
    StartDrawing(ScreenOutput())
      DrawText(200, 100, "Kein Sprite", $FFFFFF, $000000)
    StopDrawing()
  Else
    Delay(1)
  EndIf  
ForEver

Verfasst: 28.03.2007 22:43
von Kai
Nen IMA kommt nur wenn du Sprites mit #PB_Any lädst,
hab das Problemm schon mal irgendwo gepostet.

EDIT: http://www.purebasic.fr/german/viewtopi ... highlight=

Verfasst: 28.03.2007 23:14
von ts-soft
Kai hat geschrieben:Nen IMA kommt nur wenn du Sprites mit #PB_Any lädst,
hab das Problemm schon mal irgendwo gepostet.
Kann ich nicht nachvollziehen, jedenfalls nicht mit der aktuellen Version!

PS: Laut Signatur benutzt Du PB 4.2, die Version hätte ich auch gerne :mrgreen: