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...

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.
Als Tip : Dort wo du Variablen überprüfen musst reicht ein :
anstelle eines
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
