1. Im Gegensatz zur Angabe in der Hilfe gehen Sprites auch in Threads. Dabei ist egal, wo das InitSprite steht, ob im Hauptprogramm oder im Thread.
2. Leider geht trotzdem ohne OpenGL nur ein Screen. Mit OpenGL wird ein zweiter Screen geöffnet, die Ausgabe ist aber kryptisch, könnte auch am falschen OpenGL-Treiber liegen.
3. InitMovie geht nur, wenn es im ersten aufgerufenen Thread steht, dann aber bei beiden Threads. Steht InitMovie im Hauptprogramm, geht in den Threads kein PlayMovie, wird zwar geladen, aber dann als nicht existent gemeldet.
Code: Alles auswählen
UseJPEGImageDecoder()
Procedure Video1(xo)
If InitSprite() <> 0
Debug "Sprite init"
EndIf
If InitMovie() <> 0
Debug "Movie init"
EndIf
If OpenWindow(1, xo, 50, 340, 340, "Video 1", #PB_Window_BorderLess)
If OpenWindowedScreen(WindowID(1), 10, 10, 320, 320, 0, 0, 0)
LoadSprite(0, "bild.jpg")
EndIf
If LoadMovie(1, "sound.mp3") <> 0
Debug "Movie geladen"
If IsMovie(1)
PlayMovie(1, WindowID(1)) ;Abspielen starten
Else
Debug "Kein Movie"
EndIf
EndIf
EndIf
direction = 1
Repeat
Repeat
Event1 = WindowEvent()
Until Event1 = 0
ClearScreen(RGB(0,0,0))
ClipSprite(0, 0, 0, x, x)
DisplaySprite(0, x, 100)
DisplaySprite(0, x, x)
DisplaySprite(0, 300-x, x)
x + direction
If x > 300 : direction = -1 : EndIf ; moving back to the left with negative value
If x < 0 : direction = 1 : EndIf ; moving to the right with positive value
FlipBuffers() ; Inverse the buffers (the back become the front (visible)... and we can do the rendering on the back
Delay(10)
Until Quit1
EndProcedure
Procedure Video2(xo)
If OpenWindow(2, xo, 50, 340, 340, "Video 2", #PB_Window_BorderLess)
If LoadMovie(2, "sound.mp3") <> 0
Debug "Movie geladen"
If IsMovie(2)
PlayMovie(2, WindowID(2)) ;Abspielen starten
Else
Debug "Kein Movie"
EndIf
EndIf
EndIf
direction = 1
Repeat
Repeat
Event2 = WindowEvent()
Until Event2 = 0 ; Quit the event loop only when no more events are available
Delay(10)
Until Quit2
EndProcedure
CallDebugger
If OpenWindow(0, 50, 50, 340, 400, "Gadget and sprites!", #PB_Window_SystemMenu | #PB_Window_SizeGadget)
ButtonGadget(1, 10, 10, 100, 25, "Grab input")
ButtonGadget(2, 120, 10, 100, 25, "Button 2")
ButtonGadget(3, 230, 10, 100, 25, "Button 3")
TextGadget (4, 10, 40, 300, 30, "Press 'F1' to ungrab keyboard and mouse")
EndIf
td1 = CreateThread(@Video1(), 400)
Delay(2000)
td2 = CreateThread(@Video2(), 750)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
Quit = 1
EndSelect
Until Quit
KillThread(td1)
KillThread(td2)
End1. Warum muss InitMovie im Thread stehen, bei InitScreen ist es egal?
2. Gibt es eine Chance, dass jeder Thread einen WindowedScreen öffnen und darin Sprites anzeigen kann?
3. Andere Idee, wie ich von einem Programm aus zwei Screens mit Bildern versorgen kann? Soll für eine Steuerung von zwei Beamern sein, mit unterschiedlichen Inhalten.
Achso, "Threadsichere Exe" ist aktiviert.