Problème de boucle

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
jezekiel
Niveau 1
Niveau 1
Messages : 4
Enregistré le : lun. 13 mai 2019 10:42
Status : Hors ligne

Problème de boucle

#1

Message par jezekiel » lun. 13 mai 2019 11:07

Bonjour !
J'ai construit ce code à partir de morceaux récupérés ça et là car je démarre dans l’utilisation d'AutoIt et que mes expériences de programmation sont assez faibles.
Le but de ce code est d'automatiser une tâche de sauvegarde.
Nous utilisons un logiciel lié à un instrument de mesure de particules dans l'air. Les données sont enregistrées en permanence sur un serveur qui se révèle assez peu pratique à utiliser.
CE que je souhaite faire c'est utiliser le logiciel pour faire une sauvegarde des données toutes les heures. ainsi je peux récupérer ces données et les exploiter par ailleurs.
J'ai donc écrit une fonction qui lance le logiciel et procède aux manip permettant la sauvegarde des données.
J'ai écrit le code permettant d'afficher une fenêtre avec un bouton lançant la boucle d'enregistrement et qui comporte une fenêtre de texte qui affiche le nom du dernier fichier enregistré.
Le problème que je rencontre c'est que la boucle ne marche pas.
Quand je remplace la fonction que j'ai écrite par une autre plus simple, j'arrive à obtenir la répétion de celle ci. Mais avec ma fonction, ça ne marche pas.
J'en conclu qu'il y a une erreur dans ce que j'ai écrit. Ce constat est renforcé par le fait qu'une fois lancée, la boucle ne me permet plus de fermer la fenêtre crée via le bouton de fermeture X.
Si vous pouvez m'aider à débloquer la situation, ce serait formidable.
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Res_Language=1036
#AutoIt3Wrapper_Run_AU3Check=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#cs ----------------------------------------------------------------------------

 AutoIt Version : 3.3.14.5
 Auteur:        jezekiel

 Fonction du Script :
Acquisition de données LOAC

#ce ----------------------------------------------------------------------------

#pragma compile(Icon, C:\Program Files (x86)\AutoIt3\Icons\au3.ico)
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Date.au3>
#Region ### START Koda GUI section ### Form=
Global $Form1 = GUICreate("Acquisition LOAC", 615, 325, 408, 308)
Global $Input1 = GUICtrlCreateInput("", 112, 200, 409, 100, $ES_MULTILINE )
Global $Bouton1 = GUICtrlCreateButton("Acquisition", 344, 64, 201, 97)
Global $Pic1 = GUICtrlCreatePic("C:\Users\pompom\Desktop\Loac\IMG_3184.JPG", 15, 15, 239, 180) ;;chemin du fichier image
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

Func LOAC ()
        Run("C:\Eoscan\LOAC.exe")    ;;Chemin du logiciel LOAC
                WinWaitActive("LOAC")
                        While 1



                        send("^o") ;ouvrir une nouvelle mesure

                        WinWaitActive("Select a data")
                        ControlClick("Select a data", "Other ...", "[CLASS:TButton;INSTANCE:1]")
                        WinWaitActive("[Select a data;class:#32770]")

$emplacement_dossier = "C:\GPSonde\Data\loac" ;; le chemin complet du dossier de sauvegarde LOAC
$search = FileFindFirstFile($emplacement_dossier &"\*.sick")


                                If $search = -1 Then
                                MsgBox(0, "Erreur", "Pas de fichier trouvé")
                                Exit
                                EndIf

                                While 1
                                        If Winexists ("Initial Information") then
                                        send("{space}")
                                        Else
                                        $file = FileFindNextFile($search)
                                        If @error Then ExitLoop
                                        $sauve = $file
                                        send($file & "{enter}")
                                        sleep(10)
                                WEnd
        If Winexists ("Initial Information") then
        send("{space}")
        Else
        EndIf
FileClose($search)

                                WinWaitActive("LOAC - [Read File]")
                                        Send("{altdown}")
                                        Send("de")
                                        Send("{altup}")
                                WinWaitActive("Select Directory")
                                        send("{space}")
                                        send("{enter}")
                                Winclose ("LOAC - [Read File]")
                                        Send("{space}")
                                WinWaitActive("Acquisition LOAC")
                                        ControlClick("Acquisition LOAC", "" ,3)
                                        send(@Year & "{space}" & @MON & "{space}" & @MDAY & "{space}" & @HOUR & ":" & @MIN & "->" & $sauve & @CRLF )
                        sleep(10)
                        WEnd
EndFunc


While Winexists("Acquisition LOAC")
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        ExitLoop

                Case $Bouton1

                        ;While 1
                        ;       Switch $nMsg
                        ;               Case $GUI_EVENT_CLOSE
                        ;       EndSwitch
                        LOAC ()
                        sleep (3600000)
                        ;WEnd
        EndSwitch
        sleep(10)
WEnd

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5874
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Problème de boucle

#2

Message par mikell » lun. 13 mai 2019 15:56

Hello
Difficile de donner des réponses précises sans connaitre ton logiciel, ses fenêtres, etc
Mais dans cette sous-boucle :

                                While 1
                                        If Winexists ("Initial Information") then
                                            send("{space}")
                                        Else
                                            $file = FileFindNextFile($search)
                                            If @error Then ExitLoop
                                            $sauve = $file
                                            send($file & "{enter}")
                                            sleep(10)
                                WEnd
je vois 2 soucis :
1) Il manque un EndIf
2) pas moyen d'en sortir tant que la fenêtre "Initial Information" existe (mais c'est peut-être normal)
Faudrait déjà corriger ça et voir ce que ça donne...
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

jezekiel
Niveau 1
Niveau 1
Messages : 4
Enregistré le : lun. 13 mai 2019 10:42
Status : Hors ligne

Re: Problème de boucle

#3

Message par jezekiel » mar. 14 mai 2019 09:06

Bien observé !
Cette fenêtre me pose un souci, c'est qu'elle n'apparait pas systématiquement. Quand elle apparait elle me perturbe tout le reste du script.
Je vais rajouter ce Endif (autant je l'avais mis puis oublier en corrigeant et modifiant le script.

Niveau logiciel, avec le script en l'état, j'arrive parfaitement à obtenir la sauvegarde que je souhaite.
La préocédure se fait en deux temps : en premier je crée un fichier de sauvegarde des données actuellement enregistrée dans l'instrument
En second j'exporte ce fichier nouvellement crée pour en produire un exploitable en interne.
Donc je crains que mon erreur viennen de la structure même de mon script qui n'est pas du tout rigoureux.

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5874
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Problème de boucle

#4

Message par mikell » mar. 14 mai 2019 13:06

A chaque fois que la fonction LOAC est exécutée, elle relance Loac.exe. Est-ce nécessaire ? L'instance précédente de l'exe est-elle encore active ?
Et peut-être que AdlibRegister("LOAC", 3600000) serait plus indiqué que Sleep(3600000)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

jezekiel
Niveau 1
Niveau 1
Messages : 4
Enregistré le : lun. 13 mai 2019 10:42
Status : Hors ligne

Re: Problème de boucle

#5

Message par jezekiel » mar. 14 mai 2019 13:23

Adlibregister.. hmm. Je vais essayer ça.

L'exe se ferme à chaque fois oui, malheureusement.

J'essaie de changer mon script, je te tiens au courant, merci.

jezekiel
Niveau 1
Niveau 1
Messages : 4
Enregistré le : lun. 13 mai 2019 10:42
Status : Hors ligne

Re: Problème de boucle

#6

Message par jezekiel » mar. 14 mai 2019 13:36

Problème résolu !!
En continuant de creuser ce script et en le lançant avec mon casque sur les oreilles, j'ai réalisé qu'il y avait le son d'erreur de windows qui sonnait à la fin de la manip.
Le dernier élément étant d'écrire dans la fenêtre de commande d'origine, la date, l'heure et le nom du fichier qui vient d'être enregistré.
Là je me suis demandé si c'était pas cette dernière clause qui bloquait la reprise : le script ne savait pas quoi faire après cette écriture. J'ai donc calé un "ExitLoop".
ET maintenant ça tourne !
J'ai incorporé adlibregister.

Du point de vue prog, ça change quoi précisément de faire l'une ou l'autre ?
intuitivement j'ai l'impression que sleep met tout en pause puis repars, alors qu'adlib va chercher la fonction tous les xx secondes.

en tout cas merci du temps accordé.

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5874
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Problème de boucle

#7

Message par mikell » mar. 14 mai 2019 21:42

Du point de vue prog, ça change quoi précisément de faire l'une ou l'autre ?
Pas mal de choses. Par exemple pendant le Sleep ton script est bloqué et tu ne peux rien faire, même pas fermer la fenêtre
AdlibRegister te permet de te débarrasser de la boucle infinie qui n'est plus utile. D'autant que dans le script précédent, cliquer sur le bouton lance la fonction, laquelle contient cette boucle infinie dont a priori on ne sort jamais puisqu'aucune instruction ne le demande, et donc on ne sort pas de la fonction non plus. D'ailleurs probablement le Sleep ne pouvait pas s'exécuter puisqu'il faut sortir de la fonction d'abord Image
Ne connaissant pas les "réactions" du logiciel, difficile d'être plus précis
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

Répondre