[R] Barre de progression qui indiquera l'état d'avancement

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Boulanza
Niveau 9
Niveau 9
Messages : 697
Enregistré le : mer. 31 juil. 2013 15:49
Status : Hors ligne

[R] Barre de progression qui indiquera l'état d'avancement

#1

Message par Boulanza »

Bonjour,
Je ne vois pas comment faire apparaitre une barre de progression qui indiquera l'état d'avancement de l’exécution d’une application (logiciel) AutoIt. Et qui se termine à la fin du script de ladite application.
Le fichier d’exécution s’appel : « Setup.exe », Sa taille = 35 Mo
Merci de votre aide.
Modifié en dernier par Boulanza le jeu. 24 août 2017 22:06, modifié 3 fois.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Barre de progression qui indiquera l'état d'avancement

#2

Message par mikell »

Une application ça fait des actions, c'est l'état d'avancement de ces actions qu'il faut surveiller
Ton prog s'appelle "setup" et les 35 Mo j'imagine que ça représente des fichiers à installer avec un FileInstall
Personnellement je surveillerais le % installé par rapport à la taille totale, ou une balise dans la liste des fichiers, etc
ça serait bien le diable s'il n'y avait pas déjà un code comme ça qui traine quelque part sur le forum :mrgreen:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Boulanza
Niveau 9
Niveau 9
Messages : 697
Enregistré le : mer. 31 juil. 2013 15:49
Status : Hors ligne

Re: [..] Barre de progression qui indiquera l'état d'avancement

#3

Message par Boulanza »

Bonsoir,
Merci mikell pour votre suggestion.
Donnez-nous un exemple qui peut être proche ou qui peut répondre carrément à ma question. Merci.
Cordialement
Boulanza
Niveau 9
Niveau 9
Messages : 697
Enregistré le : mer. 31 juil. 2013 15:49
Status : Hors ligne

Re: [..] Barre de progression qui indiquera l'état d'avancement

#4

Message par Boulanza »

Bonjour,
Voici un code qui répond à ma question. Il me manque le pourcentage d’avancement, pourriez-vous m'aider à l'intégrer à ce code, merci.
Cordialement.

Code : Tout sélectionner

#include <GUIConstants.au3>
Opt("GuiOnEventMode",1)
$gui = GUICreate("The activation of your media is in progress...",313,90,-1,-1,"")
$pro = GUICtrlCreateProgress(15,10,280,20)
GUISetState()
GUISetOnEvent($GUI_EVENT_CLOSE,"quitter")
$_timer = TimerInit()

$tps =1000 ; temps en seconde 10000 = 1 avencemant par 10s
$pid=Run(@ScriptDir&"\Setup.exe")

$_tps  = 100/$tps
While $pro < 100
Sleep(200) ; le sleep peut être enlevé ou modifié sans affecté la progress bar

$timer = Round(TimerDiff($_timer)/1000,2) * $_tps
 $timer1 = Round(TimerDiff($_timer)/1000,0) * 1
GUICtrlSetData($pro,$timer1)

If Not ProcessExists($pid) Then
$timer2 = Round(TimerDiff($_timer)/1000,0) * 1000
GUICtrlSetData($pro,$timer2)
$Label1 = GUICtrlCreateLabel("Done", 15, 35, 100, 20)
Sleep(2000)
;MsgBox(64,"test","ok")
ExitLoop
EndIf
WEnd

Func quitter()
    Exit
EndFunc
Boulanza
Niveau 9
Niveau 9
Messages : 697
Enregistré le : mer. 31 juil. 2013 15:49
Status : Hors ligne

Re: [..] Barre de progression qui indiquera l'état d'avancement

#5

Message par Boulanza »

Bonjour,
La solution est ci-dessous.
Cordialement.

Code : Tout sélectionner

Func ActivationOfProgress01()
$pro = ProgressOn("The activation of your media is in progress...", "Please wait...")
$_timer = TimerInit()
$tps =1000 ; temps en seconde 10000 = 1 avencemant par 10s
;$pid=Run(@ScriptDir&"\setup.exe") ; ou
$pid=("setup.exe")
$_tps = 100/$tps

While $pro < 100
Sleep(200) ; le sleep peut être enlevé ou modifié sans affecté la progress bar
$timer1 = Round(TimerDiff($_timer)/1000,2) * $_tps
ProgressSet($pro,$timer1 & "%")
If Not ProcessExists($pid) Then
$timer2 = Round(TimerDiff($_timer)/1000,0) * 1000
ProgressSet(100, "Done", "Complete")
Sleep(2000)
ExitLoop
EndIf
WEnd
EndFunc
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [R] Barre de progression qui indiquera l'état d'avancement

#6

Message par walkson »

Bonjour
Mon commentaire va sûrement vous décevoir mais votre méthode, c'est du pifomètre :mrgreen:
Ce qui manque, c'est le temps total d'exécution du setup.exe. Ce qui donnerait :
$progress = Round($temps_ecoulé / $temps_total * 100,0)
ProgressSet($pro,$progress & "%")
le $temps_ecoulé étant renvoyé par TimerDiff()

Mais la méthode reste aléatoire car si votre PC a l'idée de se trainer, les temps ne sont plus valables :mrgreen:
L'idée de Mikell
je surveillerais le % installé par rapport à la taille totale
est certainement la meilleure (il a de bonnes idées, des fois, le chat vert)
Ne sachant pas ce que fait votre setup.exe, je vous propose une méthode basé sur Inetget() dont la progression correspond au chargement mais le principe reste le même chargementFait/chargementTotal * 100

#include <InetConstants.au3>
#include <MsgBoxConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Example()

Func Example()

#Region ### START Koda GUI section ### Form=
Global $Form1 = GUICreate("Form1", 407, 130, 313, 363)
Global $Label1 = GUICtrlCreateLabel("", 8, 8, 396, 25)
GUICtrlSetBkColor(-1, 0xFFFFE1)
GUICtrlSetFont(-1,11)
Global $Progress1 = GUICtrlCreateProgress(8, 48, 385, 57, BitOR($PBS_SMOOTH,$WS_BORDER), BitOR($WS_EX_CLIENTEDGE,$WS_EX_STATICEDGE))
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
   Local $sFilePath = @DesktopDir & "\doc_current.tar.gz"
   Local $iFileSize = InetGetSize("ftp://ftp.funet.fi/pub/FreeBSD/development/tarballs/doc_current.tar.gz", $INET_FORCERELOAD + 8)
   GUICtrlSetData($Label1, "Poids total " & $iFileSize )
   Sleep(2000)
   ; Download the file by waiting for it to complete. The option of 'get the file from the local cache' has been selected.
   Local $iBytesSize = InetGet("ftp://ftp.funet.fi/pub/FreeBSD/development/tarballs/doc_current.tar.gz", @DesktopDir & "\doc_current.tar.gz", $INET_FORCERELOAD + 8,1)

   While 1
      $file = FileOpen(@DesktopDir & "\doc_current.tar.gz",0)
      $rep = FileGetSize ( @DesktopDir & "\doc_current.tar.gz")
      FileClose($file)
      $info = InetGetInfo($iBytesSize,0)
      $progr = Round($rep / $iFileSize * 100,0)
      GUICtrlSetData($Label1,"chargement " & $rep &"bytes> "& $info &"> "& $iFileSize &"> "& $progr & "%" )
      GUICtrlSetData($Progress1,$progr)
      If $iFileSize = $rep Then ExitLoop
      Sleep(1000)
      $rep = 0
   WEnd

GUICtrlSetData($Label1,"Fait")
InetClose($iBytesSize)
   ; Display details about the total number of bytes read and the filesize.
   MsgBox($MB_SYSTEMMODAL, "", "The total download size: " & $info & @CRLF & _
         "The total filesize: " & $iFileSize)

   ; Delete the file.
   FileDelete($sFilePath)
EndFunc   ;==>Example
Curieusement, pour actualiser FileGetSize (), je suis obligé d'ouvrir et de fermer le "File"
Après, si le pifomètre vous convient (ça m'arrive aussi), faire gesticuler le "Progress" pour indiquer que le script progresse, peut être une solution (plus simple 8) ) (je l'ai déjà fait :( )
En espérant de vous avoir apporter (tardivement) une aide...........
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [R] Barre de progression qui indiquera l'état d'avancement

#7

Message par Tlem »

Bonsoir.
Il existe aussi d'autres solutions, dont celle-ci :
1 - Utiliser une barre de progression infinie tout comme le fait parfois Microsoft (probablement lorsqu'il est difficile de maîtriser la durée ou le pourcentage d'avancement).
2 - Indiquer par message la progression tel que : "Étape 1 sur 15" puis "Étape 2 sur 15", etc ...

L'avantage d'être telle solution, c'est qu'elle n'est dépendante de rien, il suffit d'enchaîner les messages au fur et à mesure des différentes étapes. ^^
Ca demande une rigueur de positionnement des messages, mais je pense que c'est franchement mieux que de donner une durée ou un pourcentage qui n'est pas forcément respecté. ^^

D'après les différents messages de boulanza, je pense que celui-ci crée un installateur d'application automatisé. Et même je pense que ce "Setup.exe" est utilisé dans un processus d'installation ou de réinstallation de Windows. [emoji14]

Envoyé de mon SM-N9005 en utilisant Tapatalk

Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Boulanza
Niveau 9
Niveau 9
Messages : 697
Enregistré le : mer. 31 juil. 2013 15:49
Status : Hors ligne

Re: [R] Barre de progression qui indiquera l'état d'avancement

#8

Message par Boulanza »

Bonjour tout le monde,
Cher walkson merci pour votre réponse et vos suggestions, monsieur Tlem à bien compris mon cas, la situation ou je me trouve a été parfaitement décrite par Tlem. Non comments.
Cordialement.
Modifié en dernier par Boulanza le jeu. 24 août 2017 22:09, modifié 1 fois.
Boulanza
Niveau 9
Niveau 9
Messages : 697
Enregistré le : mer. 31 juil. 2013 15:49
Status : Hors ligne

Re: [R] Barre de progression qui indiquera l'état d'avancement

#9

Message par Boulanza »

Bonjour,
Tlem, le code ci-dessous, qui répond parfaitement à ma question. Il me manque le pourcentage de progression, pourriez-vous m'aider à l'intégrer à ce code, merci.
Cordialement.

Code : Tout sélectionner

#include <GUIConstants.au3>
Opt("GuiOnEventMode",1)
$gui = GUICreate("The activation of your media is in progress...",313,90,-1,-1,"")
$pro = GUICtrlCreateProgress(15,10,280,20)
$Label01 = GUICtrlCreateLabel("%", 15, 35, 100, 20)
GUISetState()
GUISetOnEvent($GUI_EVENT_CLOSE,"quitter")
$_timer = TimerInit()

$tps =1000 ; temps en seconde 10000 = 1 avencemant par 10s
$pid=Run(@ScriptDir&"\Setup.exe")

$_tps  = 100/$tps
While $pro < 100
Sleep(200) ; le sleep peut être enlevé ou modifié sans affecté la progress bar

$timer = Round(TimerDiff($_timer)/1000,2) * $_tps
 $timer1 = Round(TimerDiff($_timer)/1000,0) * 1
GUICtrlSetData($pro,$timer1)

If Not ProcessExists($pid) Then
$timer2 = Round(TimerDiff($_timer)/1000,0) * 1000
GUICtrlSetData($pro,$timer2)
$Label01 = GUICtrlCreateLabel("Done", 15, 35, 100, 20)
Sleep(2000)
;MsgBox(64,"test","ok")
ExitLoop
EndIf
WEnd

Func quitter()
    Exit
EndFunc
Boulanza
Niveau 9
Niveau 9
Messages : 697
Enregistré le : mer. 31 juil. 2013 15:49
Status : Hors ligne

Re: [..] Barre de progression qui indiquera l'état d'avancement

#10

Message par Boulanza »

Dommage, ce script il marche bien, mais la barre de progression bloque ! ? Votre aide svp.

Code : Tout sélectionner

Func ActivationOfProgress01()
$pro = ProgressOn("The activation of your media is in progress...", "Please wait...")
$_timer = TimerInit()
$tps =1000 ; temps en seconde 10000 = 1 avencemant par 10s
;$pid=Run(@ScriptDir&"\setup.exe") ; ou
$pid=("setup.exe")
$_tps = 100/$tps

While $pro < 100
Sleep(200) ; le sleep peut être enlevé ou modifié sans affecté la progress bar
$timer1 = Round(TimerDiff($_timer)/1000,2) * $_tps
ProgressSet($pro,$timer1 & "%")
If Not ProcessExists($pid) Then
$timer2 = Round(TimerDiff($_timer)/1000,0) * 1000
ProgressSet(100, "Done", "Complete")
Sleep(2000)
ExitLoop
EndIf
WEnd
EndFunc
Boulanza
Niveau 9
Niveau 9
Messages : 697
Enregistré le : mer. 31 juil. 2013 15:49
Status : Hors ligne

Re: [..] Barre de progression qui indiquera l'état d'avancement

#11

Message par Boulanza »

Bonsoir,
Je pense que ce script peut aider à réaliser une barre de progression avec timer pour les installateurs d'application automatisé.
Cordialement.

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Global $sec, $min, $hr,$Time,$seconds,$pid
Exemple()
Func Exemple()
Global $GUI = GUICreate("The activation of your media is in progress...", 400, 80, @DesktopWidth, @DesktopHeight)
$aTaskbar = WinGetPos("[CLASS:Shell_TrayWnd]", "")

$progress_frame = GUICtrlCreateLabel("", 10, 10, 380, 35, 0x12)

 $progress = GUICtrlCreateLabel("", 11, 11, 0, 32); x = 11 and y = 11 because I thought it looks better with a visible frame.
GUICtrlSetBkColor( - 1 , 0x0000FF ) ;Rouge = 0xFF0000    7FFF00

$progress_percentage = GUICtrlCreateLabel("", 10, 21, 380, 20, 0x01); y = 21 to make the percentage vertically centered.
GUICtrlSetBkColor(-1, -2); $GUI_BKCOLOR_TRANSPARENT

Global $Label1 = GUICtrlCreateLabel("The past time : ", 10, 50, 164, 17)
Global $Label2 = GUICtrlCreateLabel("Label1", 80, 50, 164, 17)

$aWin = WinGetPos($GUI)
WinMove($GUI, "", @DesktopWidth - $aWin[2] - 4, @DesktopHeight - $aWin[3] - $aTaskbar[3] - 4)

GUISetState(@SW_SHOW)
AdlibRegister("Runtime", 1000)

;$pid=Run(@ScriptDir&"\Setup.exe")
Global $pid=("Setup.exe")

$width = 0

GUISetState()
$Timer = TimerInit()
While 1
;======================
Sleep(6500); Speed rate the Progress bar changes with. Of course you wouldn't use Sleep in a real program, as the GUI is no more responding.
        $width += 1
        GUICtrlSetPos($progress, 11, 11, $width)

	GUICtrlSetData($progress_percentage, "  " & Round($width / 380 * 100, 1) & "%" )

	If Not ProcessExists($pid) Then

	GUICtrlCreateLabel("Done     Complete", 10, 10, 380, 35, 0x01) ;10, 50, 100, 20)
	GUICtrlSetFont(-1, 28, 900, 0, "MS Sans Serif")
	GUICtrlSetColor(-1, 0xFF0000)
	Sleep(3000)
	ExitLoop
	EndIf
WEnd

EndFunc

Func Runtime()
Local $sec, $min, $hr
$sec = Mod($seconds, 60)
$min = Mod($seconds / 60, 60)
$hr = Floor($seconds / 60 ^ 2)
GUICtrlSetData( $label2, StringFormat(" "&"%02i:%02i:%02i", $hr, $min, $sec))
$seconds += 1
EndFunc
;============================================================================================
Avatar du membre
Numeric
Niveau 5
Niveau 5
Messages : 128
Enregistré le : mer. 23 mars 2016 08:17
Status : Hors ligne

Re: [..] Barre de progression qui indiquera l'état d'avancement

#12

Message par Numeric »

Boulanza a écrit : jeu. 24 août 2017 22:05 Bonsoir,
Je pense que ce script peut aider à réaliser une barre de progression avec timer pour les installateurs d'application automatisé.
Bonsoir, pour ce qui est de réaliser une installation, en temps réel, il existe une méthode simple :
1) coder l'installateur qui inclura ton programme comme fichier joint ou encore coder ton programme qui servira d'installateur pour un première utilisation...
2) dans les deux cas, les fichiers joints à décompresser s'installent ( c'est ce processus qu'il faut "mesurer dans le temps" )
3) la simple fonction
te permet de le faire, avec sa fonction callback...
4) Un petit exemple à utiliser avec les fichiers à installer...
 Local $MonTableauDeFichiers[3] = ["File1.txt","File2.pdf","File3.rtf"] ;ton $ar_Arrayc
 ;Creeons trois fichiers pour l'exemple...
 Local $iCount = 3, $iSizeTotalDeTousMesFichiers = 0
 While $iCount
    $iCount -= 1
    ;Creation des fichiers
    FileWrite(@ScriptDir&"\"&$MonTableauDeFichiers[$iCount], "SALUT SALUT SALUT SALUT" & Random(0,1000,1))

    ;Recuperation de leurs tailles
    $iSizeTotalDeTousMesFichiers += FileGetSize(@ScriptDir&"\"&$MonTableauDeFichiers[$iCount])
 WEnd

;tRansfert($MonTableauDeFichiers,@DesktopDir&"\",$iSizeTotalDeTousMesFichiers)


Func tRansfert($aSource, $sDestination, $iSizeT, $tempsVision = 1100) ;(Tableau des fichiers, le dossier de destination, la taille totale des fichiers)
   ProgressOn("Transfert","Copie en cours...") ;On affiche la barre de progression
   Local $iFileCopier = -1, $iSizeTrsfrt = 0
   While $iSizeT
      Sleep($tempsVision) ;facultatif ; RAISON : la taille des 3 fichiers est trop faible pour etre mieu vu
      $iFileCopier += 1
      $iSizeTrsfrt += FileGetSize($aSource[$iFileCopier])
      ProgressSet(($iSizeTrsfrt*100)/$iSizeT,$iSizeTrsfrt &"octets") ; le centieme de taille T par l'unité de taille
      FileCopy($aSource[$iFileCopier],$sDestination)
      $iSizeT -= $iFileCopier
      If $iSizeTrsfrt = $iSizeT Then
         ProgressSet($iSizeT,"Copie terminée",$iSizeTrsfrt &"octets")
         Sleep(1000)
         ProgressOff()
      EndIf
   WEnd

EndFunc
De 0 et 1 vers les étoiles , tout part du Binaire, Numeric
Avatar du membre
Numeric
Niveau 5
Niveau 5
Messages : 128
Enregistré le : mer. 23 mars 2016 08:17
Status : Hors ligne

Re: [..] Barre de progression qui indiquera l'état d'avancement

#13

Message par Numeric »

Numeric a écrit : ven. 25 août 2017 03:13 3) la simple fonction _WinAPI_MoveFileEx te permet de le faire, avec sa fonction callback...
De 0 et 1 vers les étoiles , tout part du Binaire, Numeric
Boulanza
Niveau 9
Niveau 9
Messages : 697
Enregistré le : mer. 31 juil. 2013 15:49
Status : Hors ligne

Re: [R] Barre de progression qui indiquera l'état d'avancement

#14

Message par Boulanza »

Bonjour,
Merci Numeric, votre suggestion est très intéressante pour l’installation de logiciel. Tlem a bien expliqué mon cas : « La réalisation d’une barre de progression qui indiquera l'état d'avancement (superficiel), non réel », ce n’est qu’un instrument d'accompagnement lors de l’exécution d’un logiciel de traitement automatisé de données et/ou
FileCopy($aSource[$iFileCopier],$sDestination)

Cordialement.
Répondre