[..] Fermer le programme pendant une boucle

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
sablier94
Niveau 4
Niveau 4
Messages : 87
Enregistré le : lun. 20 sept. 2010 10:18
Localisation : Suisse
Status : Hors ligne

[..] Fermer le programme pendant une boucle

#1

Message par sablier94 »

Bonjour,

Voilà, je bloque sur un petit problème. J'ai une boucle et j'y ai mis des instructions, mais j'aimerais qu'on puisse fermer le programme pendant que la boucle s'exécute.

Voila le code en question (qui d'ailleurs ne marche pas... :cry: )
► Afficher le texte

Merci beaucoup
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [..] Fermer le programme pendant une boucle

#2

Message par matwachich »

Code : Tout sélectionner

HotKeySet("{esc}", "_quit")


Func _quit()
Exit
EndFunc
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
sablier94
Niveau 4
Niveau 4
Messages : 87
Enregistré le : lun. 20 sept. 2010 10:18
Localisation : Suisse
Status : Hors ligne

Re: [..] Fermer le programme pendant une boucle

#3

Message par sablier94 »

Salut,

Merci pour ta réponse, mais j'aimerais que le programme se ferme si on clic sur la croix rouge, et pas avec une touche...
(enfin si je n'ai pas le choix, je ferais comme ça)

C'est embêtant car j'utilise souvent des sleep assez long et pendant ce temps, on ne peut pas fermer le programme et on doit y aller par le gestionnaire de tâche.
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: [..] Fermer le programme pendant une boucle

#4

Message par ZDS »

Bonjour,

Il y a beaucoup d'erreurs de syntaxe, et tu as des bouts de code précédés d'un Exit (donc qui ne seront jamais lus). De plus tu parles de sleeps de 6 secondes, mais vu ce que tu veux faire, je n'en vois pas l'utilité.

Bref, voici une petite correction qui fonctionne très bien.

Code : Tout sélectionner

#include <GUIConstants.au3>

Local $heure_reveil   = IniRead("reveil.ini", "heure_reveil", "heure", "Heure")
Local $minutes_reveil = IniRead("reveil.ini", "heure_reveil", "minutes", "Minutes")

#Region ### START Koda GUI section ###
$Form2 = GUICreate("Réveil by sablier94", 322, 245, 303, 219)
GUISetBkColor(0xA6CAF0)
$Combo1 = GUICtrlCreateCombo("Heure", 32, 64, 89, 25)
GUICtrlSetData(-1, "1|2|3|4|5|6|7|8|9|10|11|12",$heure_reveil)
$Choisissez = GUICtrlCreateLabel("Choisissez l'heure du réveil :", 32, 24, 201, 24)
GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
$activer = GUICtrlCreateButton("Activer", 32, 120, 89, 33, 0)
$desactiver = GUICtrlCreateButton("Désactiver", 144, 121, 89, 33, 0)
$Combo2 = GUICtrlCreateCombo("Minutes", 144, 64, 89, 25)
GUICtrlSetData(-1, "1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60 ",$minutes_reveil)
$duree = GUICtrlCreateInput("10", 32, 208, 57, 21)
$secondes = GUICtrlCreateLabel("Secondes", 96, 208, 66, 20)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
$dureetxt = GUICtrlCreateLabel("Durée de la sonnerie", 32, 176, 129, 20)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

Local $mode_actif = False ; Alarme inactive par défaut
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
        Exit
    Case $desactiver
        $mode_actif = False
    Case $activer
        $mode_actif = True
        $heure_reveil = GUICtrlRead($combo1)
        $minutes_reveil = GUICtrlRead($Combo2)
        IniWrite("reveil.ini", "heure_reveil", "heure", $heure_reveil)
        IniWrite("reveil.ini", "heure_reveil", "minutes", $minutes_reveil)
    Case Else
        If $mode_actif And $heure_reveil=@HOUR And $minutes_reveil=@MIN Then
            Beep(500,Number(GUICtrlRead($duree))*1000)
            MsgBox(0,"Réveil", "Attention, il est :" & $heure_reveil & ":" & $minutes_reveil)
            Exit
        EndIf
    EndSwitch
WEnd
A bientôt !
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
Avatar du membre
sablier94
Niveau 4
Niveau 4
Messages : 87
Enregistré le : lun. 20 sept. 2010 10:18
Localisation : Suisse
Status : Hors ligne

Re: [..] Fermer le programme pendant une boucle

#5

Message par sablier94 »

Salut,

Merci pour ton code, c'est super !

Par contre, il y a quelques trucs que je ne comprends pas et tu ne réponds pas vraiment à ma question;

-Ça change quoi entre "local" et "global" ?

-Je ne savais pas que l'on pouvait utiliser "case else". Cela veut bien dire : "Si aucune des actions qui précède n'est effectuée alors ..." ? Mais comme l'utilisateur a déjà cliqué sur activer, le else ne s'exécute pas ? En tout cas, chez moi, ton code ne marche pas, l'alerte et le beep n'arrivent jamais, comme dans mon ancien code (que je n'avais pas totalement fini...)

-Je ne vois pas où j'ai mis d'exit en trop, c'était juste que c'était mal mis en page. Et pourrais-tu me dire où tu vois des erreurs de syntaxes ? (je sais qu'il y en a, mais je suis là pour apprendre et ton code m'a apporté des choses que je ne savais pas (comme la gestion du booléen))

-le sleep, je l'ai mis pour ne pas que la boucle s'exécute très rapidement et fasse ramer le processeur, comme ça il teste la boucle toutes les 6 secondes. mais le problème, c'est justement que si il y a un sleep, on ne peut pas fermer le programme.

Merci beaucoup pour ton aide ! :wink:
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Fermer le programme pendant une boucle

#6

Message par Tlem »

Je viens de jeter un oeil sur votre code.

Voici quelques remarques :
1 - Une seule erreur de syntaxe sur la ligne 50. Il manque un & avant $heure_reveil.
2 - Je doute que la comparaison fonctionne, car @Hour et @Min renvoie des nombres à deux chiffres, or dans vos chois, les nombre < 10 sont à un seul chiffre. ;)
3 - Dans un cas comme le votre (et de manière générale, on ne met jamais
une boucle While/Wend dans une fonction).
4 - Ligne 44, vous mettez un Exit, ce qui empêchera l'exécution des lignes 45 et 46.
5 - Ligne 50, vous comparez uniquement les minutes au lieu de comparer heure et minute. :shock:
6 - A aucun moment vous comparez régulièrement l'heure stockée dans le fichier .ini et l'heure actuelle. :shock:

Quelques conseils :
Gardez votre fonction activate() telle quelle jusqu'à la ligne 39 et rajoutez un appel à un AdlibRegister qui exécutera une fonction de test sur un intervalle de 1000 millisecondes (par exemple).
Dans la fonction de test, comparez l'heure (lue dans le fichier .ini précédemment) et l'heure actuelle.
Attention au format des nombres, car pour AutoIt 1 <> 01. :mrgreen:
Si égalité alors action.
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é".
Avatar du membre
sablier94
Niveau 4
Niveau 4
Messages : 87
Enregistré le : lun. 20 sept. 2010 10:18
Localisation : Suisse
Status : Hors ligne

Re: [..] Fermer le programme pendant une boucle

#7

Message par sablier94 »

Merci pour toutes ces informations !

1- Effectivement
2- Il me semblait que pendant mes tests, il les enregistrais en un seul chiffre (ex : 2), mais je ne suis plus sûr, je vais vérifier.
3- Comment ça pas de boucle ? alors quoi donc et pourquoi ?
4- Oui, c'est bizarre comme j'ai fait ça mais c'est juste pour dire; si on clique sur la croix, alors on quitte. C'est vrai que le reste n'est pas prix en compte, mais alors cela en reviens sur ma question; comment faire pour qu'on puisse fermer le programme ?
5- C'est juste, j'avais essayé plusieurs méthodes, mais celle-ci est fausse.
6- Ben, si on enlève le "switch [...] exit" qui est faux, il teste la variable toute les 6 secondes ?!

Code : Tout sélectionner

While 1
If $heure_reveil=@HOUR then ExitLoop
Sleep(6000)
EndSwitch
WEnd
Je vais voir pour "AdlibRegister" et aussi pour le "local" qu'il faudra que j'approfondisse.

En tout cas, merci beaucoup pour votre aide. On voit très vite qu'autoit est un langage puissant.

A+
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Fermer le programme pendant une boucle

#8

Message par Tlem »

3) Tout simplement parce que votre script ce retrouvera bloquer dans la fonction et le reste du code de la boucle principale ne pourra être exécuté.

4) Cette partie doit être gérée par la boucle principale.

6) Il faudra aussi enlever EndSwitch. Par contre, le test n'est fait que sur l'heure et dans cette horrible boucle, aucun autre code ne peut être effectué.
En fait le script teste l'heure, et si ca ne correspond pas, il ce met en pause pendant 6 secondes ...

Pour votre projet, vous devez éviter de bloquer votre interface.
Pour ce faire, il ne faut aucune boucle en dehors de la boucle principale (le premier While/Wend) et surtout éviter les Sleep trop long ( < 1000 ms).
Si vous ne souhaitez pas utiliser le AdlibRegister, alors vous devrez tester l'heure dans la boucle principale en lieu et place d'un Case Else, mais quoi qu'il en soit pour chaque action, regardez à ne pas bloquer la boucle principale.
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é".
Avatar du membre
sablier94
Niveau 4
Niveau 4
Messages : 87
Enregistré le : lun. 20 sept. 2010 10:18
Localisation : Suisse
Status : Hors ligne

Re: [..] Fermer le programme pendant une boucle

#9

Message par sablier94 »

Ok, je pense avoir compris. :wink:

Oui, désolé, bien sûr qu'il n'y a pas de "endif", j'ai mal copié-collé.

Je reconstruis mon programme et je vous le poste ici.

Merci
Répondre