Enregistrement automatique

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Enregistrement automatique

Message par blendman »

Voici un petit exemple d'enregistrement automatique, utilisant un thread.

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



Dernière modification par blendman le mar. 23/juin/2015 10:33, modifié 1 fois.
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Enregistrement automatique

Message par microdevweb »

Merci Blendman
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Enregistrement automatique

Message par Ar-S »

Pratique, comme le fond certains programmes. Bien joué. :P
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Enregistrement automatique

Message par blendman »

Par contre, il faut faire attention à ce qu'on sauvegarde. Dans le cas d'une image, j'ai l'impression que ça bouffe du cpu en plus du cpu pris par le programme lui-même. (je passe à + de 50% lors de l'enregistrement automatique).

Peut-être faut-il cocher "activer la gestion des threads", dans les options du compilateur.
Répondre