Packer: callback qui ne marche pas

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Packer: callback qui ne marche pas

Message par lepiaf31 »

Bonjour, j'ai besoin de compresser des fichiers et pour cela j'utilise la bibliothèque Packer de PB. Le problème c'est que je n'arrive pas à mettre en place une fonction de callback en utilisant PackerCallback(). Ma fonction de callback n'est jamis appelée (même avec des fichiers très gros). Voilà mon code:

Code : Tout sélectionner

Procedure compressWindow()
  OpenWindow(0, 0, 0, 500, 100, "", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  TextGadget(0, 20, 20, 350, 20, "")
  ProgressBarGadget(1, 20, 40, 350, 25, 0, 1)
  ButtonGadget(2, 380, 37, 100, 30, "Annuler")
EndProcedure

Procedure uncompressCallback(source, dest)
  Debug "ok"
  SetGadgetState(1, source)
  ProcedureReturn 1
EndProcedure

compressWindow()
file$ = OpenFileRequester("fichier à compresser", "", "*.*", 0)
If file$
  SetGadgetAttribute(1, #PB_ProgressBar_Maximum, FileSize(file$))
  PackerCallback(@uncompressCallback())
  dir$ = GetTemporaryDirectory()+Str(ElapsedMilliseconds())
  Debug dir$
  CreatePack(dir$)
  AddPackFile(file$)
  ClosePack()
  Debug "fini"
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  DeleteFile(dir$)
EndIf
  
Qu'est ce qui ne va pas ?
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Packer: callback qui ne marche pas

Message par G-Rom »

c'est un bug à mon avis.
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Re: Packer: callback qui ne marche pas

Message par lepiaf31 »

Arf ... Quelqu'un d'autre pour tester ? (on ne sait jamais..)
Avatar de l’utilisateur
SPH
Messages : 4949
Inscription : mer. 09/nov./2005 9:53

Re: Packer: callback qui ne marche pas

Message par SPH »

Plein de OK, un FINI, la barre progresse a 100% mais il y a un bloquage quelque part...

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Re: Packer: callback qui ne marche pas

Message par lepiaf31 »

Ha .. chez moi les "ok" n'apparaissent pas ..
Tu as quel OS et quelle version de PB ?
Avatar de l’utilisateur
SPH
Messages : 4949
Inscription : mer. 09/nov./2005 9:53

Re: Packer: callback qui ne marche pas

Message par SPH »

4.50 beta 3 sur vista 32

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Re: Packer: callback qui ne marche pas

Message par Geo Trouvpatou »

Salut.

Pour moi W7 et 4.50 finale.
Le processus était bloquant, ce qui fait que parfois la progressBar bloquait n'importe où.

J'ai donc mis ça dans un thread.
Voici un truc qui fonctionne.

Code : Tout sélectionner

EnableExplicit
Global taille.i, progression, dir$, file$
Global evenement.i, quit.i
Procedure compressWindow()
      OpenWindow(0, 0, 0, 500, 100, "", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
      TextGadget(0, 20, 20, 350, 20, "")
      ProgressBarGadget(1, 20, 40, 350, 25, 0, 100)
      ButtonGadget(2, 380, 37, 100, 30, "Ouvrir")
EndProcedure

Procedure uncompressCallback(source, dest)
      Debug source ; Poid compressé
      
      ;progression = source*100/taille
      progression = Round((dest / taille) * 100, #PB_Round_Up)
      SetGadgetState(1, progression)
      Debug progression
      Debug dest ; Poid original
      ProcedureReturn 1
EndProcedure

compressWindow()


Procedure LancerCompression(*param.i)
      file$ = OpenFileRequester("fichier à compresser", "", "*.*", 0)
      If file$
            taille = FileSize(file$)
            dir$ = GetTemporaryDirectory()+Str(ElapsedMilliseconds())
            Debug dir$
            
            PackerCallback(@uncompressCallback())
            
            CreatePack(dir$)
            AddPackFile(file$)
            ClosePack()
            Debug "fini"
         EndIf   
            
      EndProcedure
      
      ;{
      ;- >>>>>>>>>>>> Ma loop
      Repeat
            evenement = WaitWindowEvent()
            
            ;->> Evènements Window
            If evenement = #PB_Event_CloseWindow
                  Select EventWindow() 
                              
                        Case 0 : quit = 1
                              
                  EndSelect    
            EndIf
            
            
            ;->> Evènements Boutons (Gadget en général
            If evenement =  #PB_Event_Gadget
                  Select EventGadget()
                              
                        Case 2
                              
                              CreateThread(@LancerCompression(), 0)
                              
                  EndSelect    
            EndIf
            
            
      Until quit = 1
      ;}
      
      DeleteFile(dir$)
Le truc un peu bizarre c'est que dans la "Procedure uncompressCallback" :
source ; Poid compressé
dest ; Poid original
J'aurais cru le contraire.
C'est pour ça qu'au début la progressBar ne montait jamais à 100%

Bye.

[EDIT] Ça fonctionne apparemment bien sur des fichiers de 1.5 et 4.05 Mo mais je viens de tester sur un fichier texte de 126ko et ça ne fonctionne pas :cry:


[EDIT2] En plus avec ce code ci-dessous, la compression est presque instantannée pour un fichier de 3.5Mo, alors qu'avec le code ci-dessus ça met une plombe.

Je suis étonné parce qu'un fichier texte de 3.5Mo tombe à 1,31 Ko et revient à son bon poids une fois décompressé.

Code : Tout sélectionner

Delay(4000)

CreatePack("_Packe.pakos")
AddPackFile("_AAAAA.txt", 9) 
ClosePack()

Delay(1000)

If OpenPack("_Packe.pakos")
      *nextPackFile = NextPackFile() 
      packFileSize = PackFileSize() 
      
      If *nextPackFile 
            If CreateFile(0, "_Decompresse.txt"); ;write to disk 
                  WriteData(0, *nextPackFile, packFileSize)
                  CloseFile(0) 
            EndIf 
      EndIf 
EndIf
ClosePack()
Répondre