Je cherche a charger des Sprites, sans bloquer l'interface d'une application...Et que les images apparaissent au fur et a mesure du chargement.
Voici comment je procède.
A votre avis est-ce la bonne façon de faire ? ou pas ?
comment être sur que lorsque je dessine un sprite celui si n'est pas entrain d'être charger ou effacer ?
Un mutex ça utilise une variable ? peuxt'on faire un tableau de mutex ?
il vous faudra changer la variable path.s et lui donner vers un chemin comportant des images jpg !
Code : Tout sélectionner
UsePNGImageDecoder()
UseJPEGImageDecoder()
path.s="c:\Imagestest"
If InitSprite()=0
MessageRequester("Error", "Can't Initialize DirectX Sprite", 0)
End
EndIf
If InitKeyboard()=0
MessageRequester("Error", "Can't Initialize DirectX input", 0)
End
EndIf
If InitSprite3D()=0
MessageRequester("Error", "Can't Initialize DirectX 3D", 0)
EndIf
Structure Prefs
ScreenWidth.l
ScreenHeight.l
FullScreen.b
EndStructure
Define Prefs.Prefs
Prefs\ScreenWidth.l=800
Prefs\ScreenHeight.l=600
Prefs\FullScreen.b=#False
path.s="J:\Google Drive\Developpement\Purebasic Projects\FrontMedia\Video\Series\Touch"
Structure TLI
file.s
sprite.i
EndStructure
NewList threadList.TLI()
threadListMutex=CreateMutex()
Procedure ThreadLoadImage(*truc)
Shared threadList.TLI(),threadListMutex
Protected info.TLI
Repeat
Repeat
Delay(500)
Until ListSize(threadList())>0
LockMutex(threadListMutex)
FirstElement(threadList())
info\file=threadList()\file
info\sprite=threadList()\sprite
UnlockMutex(threadListMutex)
If IsSprite3D(info\sprite)
FreeSprite3D(info\sprite)
EndIf
If IsSprite(info\sprite)
FreeSprite(info\sprite)
EndIf
Debug FileSize(info\file)
If LoadSprite(info\sprite,info\file,#PB_Sprite_Texture)
CreateSprite3D(info\sprite,info\sprite)
EndIf
LockMutex(threadListMutex)
FirstElement(threadList())
DeleteElement(threadList())
UnlockMutex(threadListMutex)
ForEver
EndProcedure
Procedure addImage(file.s,sprite.i)
Shared threadList.TLI(),threadListMutex
LockMutex(threadListMutex)
AddElement(threadList())
threadList()\file=file
threadList()\sprite=sprite
UnlockMutex(threadListMutex)
EndProcedure
If ExamineDirectory(0, path, "*.*")
While NextDirectoryEntry(0)
If DirectoryEntryType(0) = #PB_DirectoryEntry_File
If GetExtensionPart(DirectoryEntryName(0))="jpg"
NbSprite+1
addImage(path+"\"+DirectoryEntryName(0),NbSprite)
Debug DirectoryEntryName(0)
EndIf
EndIf
Wend
FinishDirectory(0)
EndIf
CreateThread(@ThreadLoadImage(),0)
Select Prefs\FullScreen
Case #True ; Ouverture en plein ecran
OpenScreen(Prefs\ScreenWidth, Prefs\ScreenHeight,32,"test")
Case #False ; Ouverture dans une Fenêtre
#W_Screen=0
OpenWindow(#W_Screen, 0, 0, Prefs\ScreenWidth, Prefs\ScreenHeight, "test", #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#W_Screen), 0, 0, Prefs\ScreenWidth, Prefs\ScreenHeight, 1, 0, 0)
EndSelect
Repeat
;Si nous somme dans une fenêtre il faut traiter tout les elements
If Prefs\FullScreen=#False
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
Until Event = 0
EndIf
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Right)
A=A+1
EndIf
If KeyboardPushed(#PB_Key_Left)
A=A-1
EndIf
If KeyboardPushed(#PB_Key_Space)
EndIf
If KeyboardPushed(#PB_Key_Escape)
End
EndIf
If KeyboardPushed(#PB_Key_Up)
EndIf
If KeyboardPushed(#PB_Key_Down)
EndIf
FlipBuffers()
ClearScreen(0)
Start3D()
For z=1 To NbSprite
If IsSprite3D(z)
DisplaySprite3D(z,z*50,z*50)
EndIf
Next
Stop3D()
StartDrawing(ScreenOutput())
DrawText(400,400,Str(A))
StopDrawing()
Delay(1)
ForEver