Animation trotz Fenster verschieben?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
KatSeiko
Beiträge: 367
Registriert: 19.07.2008 07:47

Animation trotz Fenster verschieben?

Beitrag 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
Win7 Ultimate x64, PureBasic 5.11

There is no substitute..
BildBildBild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Animation trotz Fenster verschieben?

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
KatSeiko
Beiträge: 367
Registriert: 19.07.2008 07:47

Re: Animation trotz Fenster verschieben?

Beitrag von KatSeiko »

Okay... Erklär doch mal bitte, wie das mit dem Thread mache...
Win7 Ultimate x64, PureBasic 5.11

There is no substitute..
BildBildBild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Animation trotz Fenster verschieben?

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Animation trotz Fenster verschieben?

Beitrag 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
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Animation trotz Fenster verschieben?

Beitrag 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
Zuletzt geändert von Josh am 18.11.2009 12:19, insgesamt 1-mal geändert.
Rokur
Beiträge: 167
Registriert: 29.12.2005 09:58
Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)

Re: Animation trotz Fenster verschieben?

Beitrag 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
WinXP 32 Bit, PureBasic 4.40 (x86)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Animation trotz Fenster verschieben?

Beitrag 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
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Re: Animation trotz Fenster verschieben?

Beitrag von X360 Andy »

Rokur
Crasht bei mir sofort nach dem Start ( mit Thread Safe und ohne )
Win 7,DX9,PB440B7 uund PB430
Rokur
Beiträge: 167
Registriert: 29.12.2005 09:58
Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)

Re: Animation trotz Fenster verschieben?

Beitrag 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. :wink:
WinXP 32 Bit, PureBasic 4.40 (x86)
Antworten