Seite 1 von 3
Animation trotz Fenster verschieben?
Verfasst: 18.11.2009 04:29
von KatSeiko
Ich weiß nicht, ob das unter
DX9 möglich ist... Ich habe hier ein kleines Programm, das nix anderes tut als bunte Linien auf den Bildschirm zu malen (Epilepsiewarnung). Jetzt passiert aber folgendes: Wenn man das Fenster von A nach B bewegt, hält das Programm vorübergehend an. Gibt es irgendetwas, das dafür sorgt, dass es weiter läuft?
Code: Alles auswählen
; ****************
; Demo by KatSeiko
; ****************
; Erst mal initialiseren...
InitSprite()
; Fenster und Screen...
MainWindow = OpenWindow(#PB_Any, 0, 0, 800, 600, "Test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(MainWindow), 0, 0, 800, 600, 0, 0, 0)
; Ne Structure zur einfacheren Verwendung
Structure sLine
X1.i
X2.i
Y1.i
Y2.i
C.i
EndStructure
; Hier kommen die Linien rein
Global Dim dLine.sLine(4)
; Prozeduren sind wiederverwendbar, die kann man immer gebrauchen
Procedure Randomize()
dLine(0) = dLine(1)
dLine(1) = dLine(2)
dLine(2) = dLine(3)
dLine(3) = dLine(4)
RandomSeed(ElapsedMilliseconds())
dLine(4)\x1 = Random(800)
dLine(4)\x2 = Random(800)
dLine(4)\y1 = Random(600)
dLine(4)\y2 = Random(600)
dLine(4)\C = Random($FFFFFF)
EndProcedure
Procedure RandomScreen()
ClearScreen(0)
StartDrawing(ScreenOutput())
For i = 0 To 4
LineXY(dLine(i)\x1, dLine(i)\y1, dLine(i)\x2, dLine(i)\y2, dLine(i)\c)
Next
StopDrawing()
FlipBuffers()
Randomize()
EndProcedure
; Dim füllen
For i=0 To 4
Randomize()
Next
; Programmschleife, Programm endet mit Fenster schließen.
Repeat
WEvent = WindowEvent()
RandomScreen()
Until WEvent = #PB_Event_CloseWindow
Re: Animation trotz Fenster verschieben?
Verfasst: 18.11.2009 04:41
von Kaeru Gaman
grundsätzlich: nein.
die Eventschleife von PB hält immer an, wenn man das Fenster verschiebt oder ein Menu öffnet, und klar, grad mit nem WindowedScreen sieht das nich so dolle aus.
du könntest das mit Threads oder Timer-Callback umgehen, aber in wieweit das einfach und praktikabel genug ist, um den vergleichsweise geringen Nutzen aufzuwiegen, ist halt die Frage.
Re: Animation trotz Fenster verschieben?
Verfasst: 18.11.2009 06:21
von KatSeiko
Okay... Erklär doch mal bitte, wie das mit dem Thread mache...
Re: Animation trotz Fenster verschieben?
Verfasst: 18.11.2009 11:40
von Kaeru Gaman
erklären ist gut... müßte ich selber ausprobieren.
allgemein sollte man keine window-aktionen threadweise trennen,
also der thread der das fenster öffnet sollte auch das (Wait)WindowEvent enthalten und sämtliche Befehle die sich auf Gadgets beziehen.
Für DX ist das noch kritischer, meines Wissens dürfen sich alle DX-Befehle nur im Hauptthread aufhalten.
Also müßtest du, theoretisch, in einem Zweitthread das Fenster aufmachen und alle Gadgets aufbaun und alle Events abhandeln.
erst wenn der das Fenster aufgemacht hat, macht der Hauptthread den Screen auf das Fenster und kümmert sich dann um dessen Handling.
ob das wirklich funktioniert - keine Ahnung. Grau ist jede Theorie.
Also frag dich erstmal, wofür und ob es wirklich sein muss.
ich kenn Videoplayer wo die Anzeige hinterherhinkt wenn man das Fenster verschiebt.
Re: Animation trotz Fenster verschieben?
Verfasst: 18.11.2009 12:07
von ts-soft
RandomScreen() hat so im MainLoop nichts zu suchen!
Ruf die Procedure Mithilfe eines Timers auf. Den Timer sollteste per API erstellen, mit TimerCallback!, das ist wichtig,
ansonsten stoppts bei Fensterbewegung.
Genaue Syntax über Suchfunktion oder in der MSDN suchen (SetTimer, TimerCallback usw.).
Ansonsten erstelle ich Dir ein Snippet, bin aber gerade Arbeiten, mußte bis Spätnachmittag warten.
Gruß
Thomas
Re: Animation trotz Fenster verschieben?
Verfasst: 18.11.2009 12:10
von Josh
wennst es nur in windows brauchst, dann vieleicht so:
Code: Alles auswählen
; ****************
; Demo by KatSeiko
; ****************
; Erst mal initialiseren...
InitSprite()
; Fenster und Screen...
MainWindow = OpenWindow(#PB_Any, 0, 0, 800, 600, "Test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(MainWindow), 0, 0, 800, 600, 0, 0, 0)
; Ne Structure zur einfacheren Verwendung
Structure sLine
X1.i
X2.i
Y1.i
Y2.i
C.i
EndStructure
; Hier kommen die Linien rein
Global Dim dLine.sLine(4)
Procedure Callback_Windows (hWnd, msg, wParam, lParam)
Shared MainWindow
Static MousDownOnCaption.b
Static OldMouseX.w, OldMouseY.w
Static OldWinX.w, OldWinY.w
Define NewWinX.w, NewWinY.w
Define ret.l
ret = #PB_ProcessPureBasicEvents
Select msg
Case #WM_NCLBUTTONDOWN
If wParam = #HTCAPTION
SetActiveWindow(MainWindow)
SetCapture_(hWnd)
MousDownOnCaption = #True
OldMouseX = DesktopMouseX()
OldMouseY = DesktopMouseY()
OldWinX = WindowX(MainWindow)
OldWinY = WindowY(MainWindow)
ret = 0
EndIf
Case #WM_LBUTTONUP
ReleaseCapture_()
MousDownOnCaption = #False
Case #WM_MOUSEMOVE
If MousDownOnCaption = #True
NewWinX = OldWinX - OldMouseX + DesktopMouseX()
NewWinY = OldWinY - OldMouseY + DesktopMouseY()
ResizeWindow(MainWindow, NewWinX, NewWinY, #PB_Ignore, #PB_Ignore)
EndIf
EndSelect
ProcedureReturn ret
EndProcedure
; Prozeduren sind wiederverwendbar, die kann man immer gebrauchen
Procedure Randomize()
; dLine(0) = dLine(1)
; dLine(1) = dLine(2)
; dLine(2) = dLine(3)
; dLine(3) = dLine(4)
RandomSeed(ElapsedMilliseconds())
dLine(4)\x1 = Random(800)
dLine(4)\x2 = Random(800)
dLine(4)\y1 = Random(600)
dLine(4)\y2 = Random(600)
dLine(4)\C = Random($FFFFFF)
EndProcedure
Procedure RandomScreen()
ClearScreen(0)
StartDrawing(ScreenOutput())
For i = 0 To 4
LineXY(dLine(i)\x1, dLine(i)\y1, dLine(i)\x2, dLine(i)\y2, dLine(i)\c)
Next
StopDrawing()
FlipBuffers()
Randomize()
EndProcedure
; Dim füllen
For i=0 To 4
Randomize()
Next
SetWindowCallback(@Callback_Windows())
; Programmschleife, Programm endet mit Fenster schließen.
Repeat
WEvent = WindowEvent()
RandomScreen()
Until WEvent = #PB_Event_CloseWindow
Re: Animation trotz Fenster verschieben?
Verfasst: 18.11.2009 12:19
von Rokur
Mit Threads funktioniert das bei mir einwandfrei. Laut PB-Hilfe dürfen DirectX-Befehle nicht in Threads verwendet werden, daher hab ich die in meinem Beispiel einfach im Hauptprogramm und lagere das Fenster samt Eventschleife in einen Thread aus.
Getestet mit PB 4.31 mit DX 7 und 9 Subsystem.
Die Frage ist halt ob sich das lohnt, oder ob es für die Anwendung nicht egal ist das die Animation während des Verschiebens anhält.
Code: Alles auswählen
EnableExplicit
#app = "Grafik-Demo"
Structure line
x1.i
x2.i
y1.i
y2.i
c.i
EndStructure
Global wndMain, width, height, i, thread
Global Dim lines.line(4)
width = 800
height = 600
Procedure appError(text.s)
MessageRequester(#app + " - Fehler", text, #PB_MessageRequester_Ok)
End
EndProcedure
Procedure appQuit()
End
EndProcedure
Procedure Randomize()
For i = 0 To 3
With lines(i)
\x1 = lines(i+1)\x1
\x2 = lines(i+1)\x2
\y1 = lines(i+1)\y1
\y2 = lines(i+1)\y2
\c = lines(i+1)\c
EndWith
Next i
RandomSeed(ElapsedMilliseconds())
lines(4)\x1 = Random(800)
lines(4)\x2 = Random(800)
lines(4)\y1 = Random(600)
lines(4)\y2 = Random(600)
lines(4)\c = Random($FFFFFF)
EndProcedure
Procedure drawDemo()
ClearScreen(0)
StartDrawing(ScreenOutput())
For i = 0 To 4
LineXY(lines(i)\x1, lines(i)\y1, lines(i)\x2, lines(i)\y2, lines(i)\c)
Next
StopDrawing()
Randomize()
EndProcedure
Procedure wndThread(*dummy)
wndMain = OpenWindow(#PB_Any, 0, 0, width, height, #app, #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
If Not OpenWindowedScreen(WindowID(wndMain), 0, 0, width, height, #True, 0, 0)
appError("Fehler beim Initialisieren des Screens!")
EndIf
Repeat
Define event
Repeat
event = WindowEvent()
Select event
Case #PB_Event_CloseWindow
appQuit()
EndSelect
Until event = 0
ForEver
EndProcedure
If Not InitSprite()
appError("Fehler beim Initialisieren von DirectX!")
EndIf
For i = 1 To 4
Randomize()
Next i
thread = CreateThread(@wndThread(), 0)
If Not IsThread(thread)
appError("Fehler beim Erzeugen des Window-Threads!")
EndIf
Repeat
drawDemo()
FlipBuffers()
Delay(1)
ForEver
Re: Animation trotz Fenster verschieben?
Verfasst: 18.11.2009 12:20
von ts-soft
Josh hat geschrieben:
Code: Alles auswählen
; Programmschleife, Programm endet mit Fenster schließen.
Repeat
WEvent = WindowEvent()
RandomScreen()
Until WEvent = #PB_Event_CloseWindow
Aber bitte nicht mit so einem EventLoop!
Wie gesagt einen Timer und WaitWindowEvent()!
Ob Dein Code läuft kann ich gerade nicht testen, ist aber ein CPU Fresser.
Gruß
Thomas
Re: Animation trotz Fenster verschieben?
Verfasst: 18.11.2009 12:23
von X360 Andy
Rokur
Crasht bei mir sofort nach dem Start ( mit Thread Safe und ohne )
Win 7,DX9,PB440B7 uund PB430
Re: Animation trotz Fenster verschieben?
Verfasst: 18.11.2009 12:32
von Rokur
X360 Andy hat geschrieben:Rokur
Crasht bei mir sofort nach dem Start ( mit Thread Safe und ohne )
Win 7,DX9,PB440B7 uund PB430
Mit welchem Fehler?
Bei mir läufts unter WinXP Prof 32 Bit PB 4.31 x86
Wahrscheinlich muss das Thread-Handling noch verbessert werden, hab das mal eben hingeklatscht um zu zeigen das es möglich ist, aber wie in der Hilfe schon steht passen DX und Threads nicht so gut zusammen, bzw. muss man dann sehr aufpassen.
