[R]Lenteur à la fermeture d'une GUI

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
fredf19
Niveau 1
Niveau 1
Messages : 9
Enregistré le : jeu. 04 nov. 2010 09:17
Status : Hors ligne

[R]Lenteur à la fermeture d'une GUI

#1

Message par fredf19 »

Bonjour,

j'ai créé un code pour une double authentification. La fenêtre de génération du code est longue à se fermer (environ 15 secondes).
Je ne vois pas où je pèche....
Quelqu'un aurait il une idée?
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Global $hGUI, $hLabel, $hCode, $hButtonQuit

$hGUI = GUICreate("Code", 300, 140)
$hLabel = GUICtrlCreateLabel("", 10, 10, 280, 40, $SS_CENTER)
$hCode = GUICtrlCreateLabel("", 10, 60, 280, 40, $SS_CENTER)
$hButtonQuit = GUICtrlCreateButton("Quitter", 100, 100, 100, 30)

GUISetState(@SW_SHOW)

While 1
    Local $msg = GUIGetMsg()
    Switch $msg
        Case $GUI_EVENT_CLOSE, $hButtonQuit
            ExitLoop
    EndSwitch

    Local $currentTime = @HOUR & ":" & @MIN & ":" & @SEC
    Local $nextMinute = @HOUR & ":" & @MIN + 1 & ":00"

    Local $timeDiff = _TimeDiff($currentTime, $nextMinute)
    GUICtrlSetData($hLabel, "Code valable pendant " & $timeDiff & " secondes")
    $code = Number(@YDAY) * Number(@MDAY) * Number(@HOUR) * Number(@MIN)
    GUICtrlSetData($hCode, "Code déverrouillage " & $code)

    Sleep(1000)
WEnd

Func _TimeDiff($currentTime, $nextMinute)
    Local $currentTimeArray = StringSplit($currentTime, ":")
    Local $nextMinuteArray = StringSplit($nextMinute, ":")

    Local $currentSeconds = $currentTimeArray[1] * 3600 + $currentTimeArray[2] * 60 + $currentTimeArray[3]
    Local $nextMinuteSeconds = $nextMinuteArray[1] * 3600 + $nextMinuteArray[2] * 60 + $nextMinuteArray[3]

    Local $diff = $nextMinuteSeconds - $currentSeconds
    Return $diff
EndFunc
Merci d'avance.
Modifié en dernier par fredf19 le mar. 16 avr. 2024 15:32, modifié 1 fois.
Avatar du membre
Numeric
Niveau 5
Niveau 5
Messages : 131
Enregistré le : mer. 23 mars 2016 08:17
Status : Hors ligne

Re: Lenteur à la fermeture d'une GUI

#2

Message par Numeric »

Salut, ton problème est du à la fonction Sleep qui est dans la boucle principale de ton programme. Il faut savoir que quand on écoute les évènements dans boucle principale grâce à la fonction GUIGetMsg, il est inutile de d'insérer l'instruction Sleep puisque GUIGetMsg à l'avantage de gérer automatiquement le CPU. De plus, tu fais dormir pendent trop longtemps ton script jusqu'à une seconde: pas donc étonnant que des messages soient "loupés."
SUPPRIME tout simplement Sleep(1000) de la boucle principale et le tour est joué.
De 0 et 1 vers les étoiles , tout part du Binaire, Numeric
fredf19
Niveau 1
Niveau 1
Messages : 9
Enregistré le : jeu. 04 nov. 2010 09:17
Status : Hors ligne

Re: Lenteur à la fermeture d'une GUI

#3

Message par fredf19 »

Merci en effet cela va mieux.
J'avais mis un sleep à 1secondes pour éviter l'effet de scintillement lors de l'actualisation du décompte.
Entre les deux c'est vrai que je préfère la rapidité.
Avatar du membre
Numeric
Niveau 5
Niveau 5
Messages : 131
Enregistré le : mer. 23 mars 2016 08:17
Status : Hors ligne

Re: Lenteur à la fermeture d'une GUI

#4

Message par Numeric »

Personnellement, j'opterai pour un Timer. Ce qui est beaucoup plus approprié dans ce contexte. Je te propose un exemple:


#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Timers.au3>

Global $hGUI, $hLabel, $hCode, $hButtonQuit

$hGUI = GUICreate("Code", 300, 140)
$hLabel = GUICtrlCreateLabel("", 10, 10, 280, 40, $SS_CENTER)
$hCode = GUICtrlCreateLabel("", 10, 60, 280, 40, $SS_CENTER)
$hButtonQuit = GUICtrlCreateButton("Quitter", 100, 100, 100, 30)

_Timer_SetTimer($hGUI, 999, "UpdateCodeAndTimeRemaining") ; Calcul effectué toutes les secondes : 999 pour plus de précision.

Global Const $g_CODE_VALIDITY = 10 ;  Durée de validité du code : 10 secondes
Global $g_remainingTime = $g_CODE_VALIDITY + 1
Global Const $g_CODE_PREFIX = "Code déverrouillage "

GUISetState(@SW_SHOW)

While 1
   Switch GUIGetMsg()
      Case $GUI_EVENT_CLOSE, $hButtonQuit
         ExitLoop
   EndSwitch
WEnd

_Timer_KillAllTimers($hGUI)
GUIDelete($hGUI)

Func UpdateCodeAndTimeRemaining($hWnd, $iMsg, $wParam, $lParam)
   $g_remainingTime -= 1
   Local $code = GUICtrlRead($hCode)

   If $g_remainingTime <= 0 Or $g_remainingTime >= $g_CODE_VALIDITY Then
      $g_remainingTime = $g_CODE_VALIDITY
      $code = Number(@YDAY) * Number(@MDAY) * Number(@HOUR) * Random(0, 9, 1)
   EndIf

   GUICtrlSetData($hLabel, "Code valable pendant " & $g_remainingTime & " secondes")

   $code = StringReplace($code, $g_CODE_PREFIX, "")
   GUICtrlSetData($hCode, $g_CODE_PREFIX & $code)
EndFunc   ;==>UpdateCodeAndTimeRemaining
De 0 et 1 vers les étoiles , tout part du Binaire, Numeric
fredf19
Niveau 1
Niveau 1
Messages : 9
Enregistré le : jeu. 04 nov. 2010 09:17
Status : Hors ligne

Re: Lenteur à la fermeture d'une GUI

#5

Message par fredf19 »

Je vais regarder et essayer d'adapter à mon contexte.
Merci
Répondre