Charment images dans un Thread et affichage en même temps
Publié : sam. 14/mai/2016 10:06
Bonjour,
je profite de ce long week-end pour me remettre un peu au purebasic.
Je cherche a afficher des miniatures de photos... mais pour ne pas figer l'application durant le chargement des miniatures, j'essaye de charger ça dans un Thread
Mais le problème c'est que ça bug du fait que j'utilise la même liste dans le thread de chargement que dans la boucle principal pour les afficher.
Certaine miniatures disparaissent ou bien même se décalent ... Je sais qu'il faut utiliser les mutex ou les semaphores... mais ou bien ça n'affiche plus rien le temps que ça charge ou bien ça continue de déconner.
quelqu'un pourrait il m'aider ? ou me donner une piste ?
voici un version de mon code simplifier. il faut sélectionner un répertoire avec des images en ".jpg" (si possible plus d'une dizaine)
je profite de ce long week-end pour me remettre un peu au purebasic.
Je cherche a afficher des miniatures de photos... mais pour ne pas figer l'application durant le chargement des miniatures, j'essaye de charger ça dans un Thread
Mais le problème c'est que ça bug du fait que j'utilise la même liste dans le thread de chargement que dans la boucle principal pour les afficher.
Certaine miniatures disparaissent ou bien même se décalent ... Je sais qu'il faut utiliser les mutex ou les semaphores... mais ou bien ça n'affiche plus rien le temps que ça charge ou bien ça continue de déconner.
quelqu'un pourrait il m'aider ? ou me donner une piste ?
voici un version de mon code simplifier. il faut sélectionner un répertoire avec des images en ".jpg" (si possible plus d'une dizaine)
Code : Tout sélectionner
EnableExplicit
UseJPEGImageDecoder()
;-Applications Datas
Structure media
name.s
mutex.i
image.i
EndStructure
Structure appDatas
folder.s ;current folder to examine
exiftoolExe.s ;path to exifTool executable
thumbnailSize.l ;thumbnail Size
List media.media()
EndStructure
Global appDatas.appDatas
;- Preferences
#Gdt_ThumbnailSize_Max=320
#Gdt_ThumbnailSize_Min=64
appDatas\folder=PathRequester("Choisissez un répertoire avec des photos", "")
appDatas\thumbnailSize=128
;-Windows And Gadget Init
; Windows
#win_Main=0
; Gadget
Enumeration
#Gdt_Thumbnails
#Gdt_ThumbnailSize
EndEnumeration
; Timer
Enumeration
#Timer_RefreashThumbnails
EndEnumeration
OpenWindow(#win_Main,0,0,1900,980,"PhotoRanking", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(#Gdt_Thumbnails, WindowWidth(#win_Main)/6, 10, WindowWidth(#win_Main)/6*4, WindowHeight(#win_Main)-100)
TrackBarGadget(#Gdt_ThumbnailSize, WindowWidth(#win_Main)/6, GadgetY(#Gdt_Thumbnails)+GadgetHeight(#Gdt_Thumbnails), 200, 25, #Gdt_ThumbnailSize_Min, #Gdt_ThumbnailSize_Max)
Procedure loadFolder(n)
AddWindowTimer(#win_Main, #Timer_RefreashThumbnails, 250) ; add a Timer to refreash Thumbnails
If ExamineDirectory(0, appDatas\folder, "*.*")
While NextDirectoryEntry(0)
If DirectoryEntryType(0) = #PB_DirectoryEntry_File
;Taille$ = " (Taille : " + DirectoryEntrySize(0) + ")"
Select LCase(GetExtensionPart(DirectoryEntryName(0)))
Case "jpg"
AddElement(appDatas\media())
appDatas\media()\mutex=CreateMutex()
appDatas\media()\name=appDatas\folder+"\"+DirectoryEntryName(0)
appDatas\media()\image=ListSize(appDatas\media())
If LoadImage(ListSize(appDatas\media()),appDatas\media()\name)
;ResizeImage(appDatas\media()\image,320,200,#PB_Image_Raw)
Debug "Ok : "+Str(ListSize(appDatas\media()))+" >"+DirectoryEntryName(0)
Else
Debug "Error load :"+DirectoryEntryName(0)
EndIf
EndSelect
EndIf
;Debug DirectoryEntryName(0)
Wend
FinishDirectory(0)
EndIf
RemoveWindowTimer(#win_Main, #Timer_RefreashThumbnails) ;Not needed anymore to refreash Thumbnails
EndProcedure
CreateThread(@loadFolder(),0)
Procedure DrawPreview()
Protected width.l
Protected n.l
Protected nb.l ;Thumb number on 1 line
Protected delta.l ;
Protected x.l,y.l ;Coord about a Thumbnail
Protected nx.l
StartDrawing(CanvasOutput(#Gdt_Thumbnails))
Box(0,0,GadgetWidth(#Gdt_Thumbnails),GadgetHeight(#Gdt_Thumbnails),RGB(128,128,128))
width=appDatas\thumbnailSize
nb=Int(GadgetWidth(0)/width)
delta=(GadgetWidth(0)-(nb*width))/nb
ForEach appDatas\media()
n=ListIndex(appDatas\media())
y=Int(n/nb)*width
nx=(n-Int(n/nb)*nb)
x=delta/2+nx*width+nx*delta
Box(x,y,width-2,width-2,#Red)
If IsImage(appDatas\media()\image)
DrawImage(ImageID(appDatas\media()\image),x,y,width,width)
EndIf
DrawText(x,y,Str(n))
Next
StopDrawing()
EndProcedure
DrawPreview()
Define event.i
Repeat
event = WaitWindowEvent()
Select event
Case #PB_Event_Timer
Select EventTimer()
Case #Timer_RefreashThumbnails
DrawPreview()
EndSelect
Case #PB_Event_Gadget
Select EventGadget()
Case #Gdt_ThumbnailSize
appDatas\thumbnailSize=GetGadgetState(#Gdt_ThumbnailSize)
DrawPreview()
;CloseWindow(0)
;End
EndSelect
EndSelect
Until event = #PB_Event_CloseWindow