Dans cet exemple, j'enregistre une image, uniquement s'il y a eu un changement sur l'image. Mais on peut utiliser ce système pour n'importe quoi. Idéal pour éviter de perdre ses document si le programme plante par exemple ou pour garder plusieurs versions du document.
Dans cette exemple, j'ai pris une taille d'image assez grande (2000*2000) pour montrer l'intérêt des thread.
On peut continuer à dessiner alors qu'on enregistre en même temps une grande image, sans que ça ne gène notre programme.
Code : Tout sélectionner
; pb : 5.22 & 5.31
; blendman
; exemple d'autosave utilisant les threads
#img = 0
Global ImageHasChanged.a
UsePNGImageEncoder()
Procedure AlertThread(Parameter)
Repeat
If ImageHasChanged
Debug "save image !"
ImageHasChanged = 0
If IsImage(#img)
If SaveImage(#img, "image.png",#PB_ImagePlugin_PNG)
EndIf
EndIf
Delay(50000); toutes les minutes, on sauvegarde l'image, uniquement si elle a changée (50 sec + les 10 secondes de la boucle)
EndIf
; si elle n'a pas changé, on revérifie toutes les 10 s
Debug "image n'a pas changé, on revérifiera dans 10 secondes"
Delay(10000) ; mettre un délai ici, pour libérer le processeur ;)
ForEver
EndProcedure
If OpenWindow(0, 0, 0, 1024, 768, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
w = 2000
h = 2000
If ScrollAreaGadget(#PB_Any,0,0,1024,768,w,h)
CanvasGadget(0, 0, 0, w, h)
CloseGadgetList()
EndIf
If CreateImage(#img,w,h,32,#PB_Image_Transparent)=0
MessageRequester("erreur", "pas d'image")
EndIf
CreateThread(@AlertThread(), 154)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget And EventGadget() = 0
If EventType() = #PB_EventType_LeftButtonDown Or (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(0, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
ImageHasChanged = 1
If StartDrawing(CanvasOutput(0))
x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
Circle(x, y, 10, RGB(Random(255), Random(255), Random(255)))
StopDrawing()
EndIf
ElseIf EventType() = #PB_EventType_LeftButtonUp
If StartDrawing(ImageOutput(#img))
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawAlphaImage(GetGadgetAttribute(0, #PB_Canvas_Image), 0, 0)
StopDrawing()
EndIf
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
EndIf