Page 1 sur 1

Problème de boucle

Posté : lun. 13 mai 2019 12:07
par jezekiel
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

Re: Problème de boucle

Posté : lun. 13 mai 2019 16:56
par mikell
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...

Re: Problème de boucle

Posté : mar. 14 mai 2019 10:06
par jezekiel
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.

Re: Problème de boucle

Posté : mar. 14 mai 2019 14:06
par mikell
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)

Re: Problème de boucle

Posté : mar. 14 mai 2019 14:23
par jezekiel
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.

Re: Problème de boucle

Posté : mar. 14 mai 2019 14:36
par jezekiel
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é.

Re: Problème de boucle

Posté : mar. 14 mai 2019 22:42
par mikell
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