[..] Deuxième Boucle while bloquant les évènements

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Avatar du membre
stevanovich
Niveau 3
Niveau 3
Messages : 33
Enregistré le : dim. 17 janv. 2010 07:47
Localisation : Bretagne
Status : Hors ligne

[..] Deuxième Boucle while bloquant les évènements

#1

Message par stevanovich »

Bonjour,

Je suis confronté à un problème de méthode de programmation (il me semble) .... je vais tenter d'expliquer :

J'ai une boite de dialogue principale avec tout un tas de bouton executant des tâches windows, gérée avec une première boucle while wend .

J'ai besoin d'effectué une reconnaissance utilisateur, et pour des raisons ergonomiques, j'utilise une tierce boite de dialogue.
Cette boite de dialogue est appelée par une fonction, liée un un évènement bouton.

Code : Tout sélectionner

GUICtrlSetOnEvent($Login,"Process_Login")
Donc, cette fonction affiche la boite de dialogue, et doit attendre le bon code d'authentification avant de continuer son process, pour ce, j'utilise un autre boucle while wend, ce qui semblerait poser problème ... car plus aucun évènement ne répond pendant cette seconde boucle.


code complêt :
Partiellement corrigé suite aux remarques.
► Afficher le texte
Je suis preneur de toutes suggestions :wink:

Cordialement.
Modifié en dernier par sylvanie le sam. 25 sept. 2010 19:02, modifié 6 fois.
Raison : Merci d'utiliser les balises "poiler" pour les codes longs
Cordialement.
----------------------------
Avatar du membre
stevanovich
Niveau 3
Niveau 3
Messages : 33
Enregistré le : dim. 17 janv. 2010 07:47
Localisation : Bretagne
Status : Hors ligne

Re: [..] Deuxième Boucle while bloquant les évènements

#2

Message par stevanovich »

Oops
Je viens de penser à une solution :
Créer un .exe executant ma fonction avec un Runwait(), cependant ça oblige à sortir les password (sauf si crypter)
... et ça fait un peu bricolage ... :?


Cordialement
Cordialement.
----------------------------
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Deuxième Boucle while bloquant les évènements

#3

Message par GaRydelaMer »

Bonjour

beaucoup d'erreur dans ton code.

1 Tu mélanges 2 concepts
Les modes évènementiels. Tu utilises mal ton 1er while avec l'option Opt("GUIOnEventMode", 1)

2 Tu as 1 variables pour 2 objets très différents: $Login
Prend pour habitude de te donner une règle de nommage des variables, et surtout de les déclarer.
$i_, pour les entiers
$GUI_, pour les Gui
$s_, pour les chaines
$h_, pour les handlers

etc.. à toi de te faire une convention pour facilement distinguer les types de variables et ainsi avoir une idée de leur contenu.

3 Utilises plutôt GuiCtrlRead() pour les contrôles créer dans ton code au lieu de ControlGetText()

4 Ta boucle While 1 dans la fonction tournera toujours, fais attention a la portée des variables, ce qui rejoint le pt 2 en les déclarant:
Dim, local, Global.
Avatar du membre
stevanovich
Niveau 3
Niveau 3
Messages : 33
Enregistré le : dim. 17 janv. 2010 07:47
Localisation : Bretagne
Status : Hors ligne

Re: [..] Deuxième Boucle while bloquant les évènements

#4

Message par stevanovich »

GaRydelaMer a écrit :Bonjour
beaucoup d'erreur dans ton code.
Merci pour ta réponse ...
Je n'ai pas la prétention d'être parfait , et donc j'ai envie d'apprendre :wink:
GaRydelaMer a écrit : 1 Tu mélanges 2 concepts
Les modes évènementiels. Tu utilises mal ton 1er while avec l'option Opt("GUIOnEventMode", 1)
Oui, j'avais aussi constater que cette option rendait inopérant la condition de sortie de mon 1er while .... :mrgreen:
Et donc j'ai rajouter les event sur les GUI.
Je suis preneur de toute(s) suggestion(s) .

GaRydelaMer a écrit : 2 Tu as 1 variables pour 2 objets très différents: $Login
Prend pour habitude de te donner une règle de nommage des variables, et surtout de les déclarer.
Ok vu.
GaRydelaMer a écrit : 3 Utilises plutôt GuiCtrlRead() pour les contrôles créer dans ton code au lieu de ControlGetText()
Ok , Merci.
GaRydelaMer a écrit : 4 Ta boucle While 1 dans la fonction tournera toujours, fais attention a la portée des variables, ce qui rejoint le pt 2 en les déclarant:
Dim, local, Global.
Oui, et je souhaite qu'elle tourne toujours.
Ok pour la portée des variables.

Et concernant mon problème d'évènement plus pris en compte dès la mise en route de ma seconde boucle ? :mrgreen:

Cordialement.
Cordialement.
----------------------------
Avatar du membre
stevanovich
Niveau 3
Niveau 3
Messages : 33
Enregistré le : dim. 17 janv. 2010 07:47
Localisation : Bretagne
Status : Hors ligne

Re: [..] Deuxième Boucle while bloquant les évènem

#5

Message par stevanovich »

J'ai essayé avec la fonction WinWaitClose() : Identique, plantage du script , plus aucun évènement ne répond.
► Afficher le texte
Je continue mes recherches ....
Modifié en dernier par sylvanie le sam. 25 sept. 2010 19:03, modifié 3 fois.
Raison : Merci d'utiliser les balises "poiler" pour les codes longs
Cordialement.
----------------------------
Avatar du membre
jbnh
Niveau 11
Niveau 11
Messages : 1932
Enregistré le : ven. 02 mai 2008 14:54
Localisation : Bruxelles
Status : Hors ligne

Re: [..] Deuxième Boucle while bloquant les évènem

#6

Message par jbnh »

Bonjour,

Merci d'utiliser le code couleur que pour les exemples de scripts et tutoriels.
Balise [..] devant votre requête en cours, [R] quand résolu | Pas de message concernant les bots !

Merci
Avatar du membre
stevanovich
Niveau 3
Niveau 3
Messages : 33
Enregistré le : dim. 17 janv. 2010 07:47
Localisation : Bretagne
Status : Hors ligne

Re: [..] Deuxième Boucle while bloquant les évènements

#7

Message par stevanovich »

jbnh a écrit : Merci d'utiliser le code couleur que pour les exemples de scripts et tutoriels.
Bonjour,
Je m'efforce tant bien que mal à respecter la chartre, mais il semblerait qu'il y ait un bug :
1 - Mon texte apparait vert
2 - Lors de l'édition d'un post, le code repasse en =texte ???
3 - Au bout de 5 post je re re re re met en AutoIt .... jusqu'a la prochaine :mrgreen:

Cordialement.

ReCorrigé :mrgreen:
Cordialement.
----------------------------
Avatar du membre
Jerome
Niveau 9
Niveau 9
Messages : 661
Enregistré le : mar. 07 avr. 2009 08:35
Localisation : Picardie
Status : Hors ligne

Re: [..] Deuxième Boucle while bloquant les évènements

#8

Message par Jerome »

Justement, on veut pas que vous mettiez le code couleur ....

Si sa s'en va, c'est qu'un modérateur le corrige a chaque fois pour l'enlever ....


Jérôme
Avatar du membre
stevanovich
Niveau 3
Niveau 3
Messages : 33
Enregistré le : dim. 17 janv. 2010 07:47
Localisation : Bretagne
Status : Hors ligne

Re: [..] Deuxième Boucle while bloquant les évènements

#9

Message par stevanovich »

Jerome a écrit :Justement, on veut pas que vous mettiez le code couleur ....
Si sa s'en va, c'est qu'un modérateur le corrige a chaque fois pour l'enlever ....
Jérôme
Merci !
Expliquer comme-ça je comprends mieux :D

Cordialement.
Cordialement.
----------------------------
Avatar du membre
jbnh
Niveau 11
Niveau 11
Messages : 1932
Enregistré le : ven. 02 mai 2008 14:54
Localisation : Bruxelles
Status : Hors ligne

Re: [..] Deuxième Boucle while bloquant les évènem

#10

Message par jbnh »

Si t'enleves le winwaitclose tout marche....
Balise [..] devant votre requête en cours, [R] quand résolu | Pas de message concernant les bots !

Merci
Avatar du membre
stevanovich
Niveau 3
Niveau 3
Messages : 33
Enregistré le : dim. 17 janv. 2010 07:47
Localisation : Bretagne
Status : Hors ligne

Re: [..] Deuxième Boucle while bloquant les évènem

#11

Message par stevanovich »

jbnh a écrit :Si t'enleves le winwaitclose tout marche....
Oui, je suis tout à fait d'accord ....
Ce que je cherchais à faire avec le WinWaitClose(), c'était d'attendre la fin du processus d'identification , donc identifié par le fermeture de la fenêtre d'identification , pour continuer mon code, un peu à l'identique d'une inputbox .
Sauf que ,elle aussi, bloque le reste du process while ... wend :?

Merci jbnh.
Cordialement.
----------------------------
Avatar du membre
stevanovich
Niveau 3
Niveau 3
Messages : 33
Enregistré le : dim. 17 janv. 2010 07:47
Localisation : Bretagne
Status : Hors ligne

Re: [..] Deuxième Boucle while bloquant les évènements

#12

Message par stevanovich »

Correction apportée pour une gestion des évènements via GUIGetMsg(1) et interruption du process en attendant la saisie du mot de passe avec une InputBox():
► Afficher le texte
L'avantage de l'InputBox(), c'est qu'elle est autogérée, le bouton OK est fonctionnel, et mon code patiente en attendant le retour de la box .....
Cependant, si l'InputBox() est affichée, la boucle While/Wend est interrompue : si le bouton logoff est actionné, rien ne se passe .
Est-ce une contrainte logicielle ? ou une erreur de programmation ?

Merci,
Modifié en dernier par sylvanie le sam. 25 sept. 2010 19:04, modifié 1 fois.
Raison : Merci d'utiliser les balises "poiler" pour les codes longs
Cordialement.
----------------------------
Avatar du membre
stevanovich
Niveau 3
Niveau 3
Messages : 33
Enregistré le : dim. 17 janv. 2010 07:47
Localisation : Bretagne
Status : Hors ligne

Re: [..] Deuxième Boucle while bloquant les évènements

#13

Message par stevanovich »

En résumé, pour contourner mon problème de blocage, je procède comme suit :

1 - Je découpe mon process en 2 parties Avant et après validation du mot de passe
2 - J'ai développé ma propre GUI de saisie de mot de passe avec passage de variable: CheckPassword($s_Password,$s_Password_True,$s_Password_False)
  • Le mot de passe : $s_Password
    Fonction retour sur mot de passe ok : $s_Password_True = 'PasswordTrue("Valeur")'
    Fonction sur mot de passe erroné : $s_Password_False = 'PasswordFalse("Valeur")'
3 - J'utilise l'option GUIOnEventMode à 1
4 - L'évènement bouton OK de saisie du mot de passe teste la valeur de l'input, puis, selon le résultat, j'utilise la function Execute('PasswordTrue("Valeur")') avec Execute($s_Password_True) ou Execute($s_Password_False)

En espérant avoir été clair .... :?

Cordialement.
Cordialement.
----------------------------
Alexward
Niveau 4
Niveau 4
Messages : 76
Enregistré le : jeu. 27 mai 2010 01:24
Status : Hors ligne

Re: [..] Deuxième Boucle while bloquant les évènements

#14

Message par Alexward »

Salut, pour ton premier code, essai sa:
► Afficher le texte

A+
Avatar du membre
stevanovich
Niveau 3
Niveau 3
Messages : 33
Enregistré le : dim. 17 janv. 2010 07:47
Localisation : Bretagne
Status : Hors ligne

Re: [..] Deuxième Boucle while bloquant les évènements

#15

Message par stevanovich »

Alexward a écrit :Salut, pour ton premier code, essai sa:
Bonjour Alexward, merci pour ta réponse.
On sort du contexte de fonctionnement que je m'étais imposé ( à tort surement).
On a une GUI avec un process en cours d'execution.
On appelle une autre GUI, déclenchée par le le bouton LOGIN , dont l'issue (Mot de passe OK) autorise ou pas la poursuite du process login .
Or ce que tu me présentes sort du cadre fonctionnel.
Bien tenté :wink:

à ce jour, je ne suis pas certain qu'il soit possible de demander à un processus d'attendre l'issue d'un résultat ou d"une boite, sans perturber les autres precess en cours.

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

Re: [..] Deuxième Boucle while bloquant les évènements

#16

Message par Tlem »

Après avoir regardé votre code (celui du premier message), voici quelques réflexions :

1 - Dans quel mode de fonctionnement voulez-vous utiliser votre script ?
Événementiel ou avec la boucle de message, car dans le code de votre premier message, il y a un mélange des deux modes. Ce qui n'aide pas vraiment le fonctionnement et la compréhension.
Si vous partez sur de l'événementiel alors vous pouvez alléger votre boucle d'attente en remplaçant tout ce qu'il y a dedans par un simple Sleep(50).

2 - Vous créez une GUI qui est sensée être une boite de dialogue pour la GUI1. Mais en règles générale, une boite de dialogue doit être un élément enfant de sa fenêtre principale, sinon, on risque de la retrouver derrière la GUI1 !!!

3 - Ce point rejoint le point N°1, mais je doit l'expliquer afin que vous compreniez votre erreur.
Vous utilisez le mode événementiel, mais dans la fonction Process_Login(), vous enfermez le code dans une boucle While.
Dans ce cas précis, comment voulez-vous que votre code 'accède' au reste du script. :roll:

4 - Dans votre code, vous associez la fermeture de la GUI de vos deux fenêtres à la même fonction. Si vous ne prenez pas soin de vérifier d'où vient l'événement, alors votre programme ce terminera quelque soit la GUI que vous fermerez (y compris avec la pseudo boite de dialogue).

Si vous arrivez à résoudre ces quelques points, vous devriez pouvoir avoir un code fonctionnel. :wink:
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é".
Alexward
Niveau 4
Niveau 4
Messages : 76
Enregistré le : jeu. 27 mai 2010 01:24
Status : Hors ligne

Re: [..] Deuxième Boucle while bloquant les évènements

#17

Message par Alexward »

Bon bah essaie sa :) je suis sur que cela fera ton affaire :D
► Afficher le texte
Avatar du membre
stevanovich
Niveau 3
Niveau 3
Messages : 33
Enregistré le : dim. 17 janv. 2010 07:47
Localisation : Bretagne
Status : Hors ligne

Re: [..] Deuxième Boucle while bloquant les évènements

#18

Message par stevanovich »

Merci Tlem d'avoir encore consacré du temps à mon code.
Tlem a écrit :Après avoir regardé votre code (celui du premier message), voici quelques réflexions :
1 - Dans quel mode de fonctionnement voulez-vous utiliser votre script ?
Événementiel ou avec la boucle de message, car dans le code de votre premier message, il y a un mélange des deux modes. Ce qui n'aide pas vraiment le fonctionnement et la compréhension.
Si vous partez sur de l'événementiel alors vous pouvez alléger votre boucle d'attente en remplaçant tout ce qu'il y a dedans par un simple Sleep(50).
Oui, c'est un copier/coller (merder) pour faire mon exemple, je travail uniquement en évènementiel.
Tlem a écrit : 2 - Vous créez une GUI qui est sensée être une boite de dialogue pour la GUI1. Mais en règles générale, une boite de dialogue doit être un élément enfant de sa fenêtre principale, sinon, on risque de la retrouver derrière la GUI1 !!!
Bien que je maîtrise bien les relations parent/child , je ne comprends pas "derrière le GUI1"
Tlem a écrit : 3 - Ce point rejoint le point N°1, mais je doit l'expliquer afin que vous compreniez votre erreur.
Vous utilisez le mode événementiel, mais dans la fonction Process_Login(), vous enfermez le code dans une boucle While.
Dans ce cas précis, comment voulez-vous que votre code 'accède' au reste du script. :roll:
C'est bien là que réside le problème, l'évènement n'est pas indépendant ou milti-thread, il interrompt la première boucle while en cours de fonctionnement, ce qui à mes yeux, n'est pas logique ....
Bref, bien que n'ayant pas l'habitude de gérer ce cas de figure, je pense avoir saisi cette subtilité que j'ai corrigé en découpant mon process par étapes, appelée les unes après les autres selon les évènements.

Tlem a écrit : 4 - Dans votre code, vous associez la fermeture de la GUI de vos deux fenêtres à la même fonction. Si vous ne prenez pas soin de vérifier d'où vient l'événement, alors votre programme ce terminera quelque soit la GUI que vous fermerez (y compris avec la pseudo boite de dialogue).
Oui, désolé, je n'ai pas attaché d'importance à la fermeture de mes GUI étant donné que c'était un exemple , dans le futur j'attacherai une importance particulière à expliquer ou réside le problème, en précisant que le code fourni est juste une démo.


Je reste cependant à l'écoute du point 3, car si une solution technique existe, je serai intéressé de pouvoir déclencher des évènements autonome ou multi-thread (si techniquement réalisables :mrgreen: )

Cordialement,
Merci.
Cordialement.
----------------------------
Avatar du membre
stevanovich
Niveau 3
Niveau 3
Messages : 33
Enregistré le : dim. 17 janv. 2010 07:47
Localisation : Bretagne
Status : Hors ligne

Re: [..] Deuxième Boucle while bloquant les évènements

#19

Message par stevanovich »

Alexward a écrit :Bon bah essaie sa :) je suis sur que cela fera ton affaire :D
Bonjour Alexward ,

On approche, mais le problème reste identique, le process continue alors que le login n'est pas effectué:

On affiche "Ok login effectué" alors que ce n'est pas le cas ....
► Afficher le texte
Comme je l'ai expliqué plus haut, la seule solution trouvée est de découpé mon process en 2 fonctions, et d"appeler la deuxième sur resultat ok en sortie du login.

D'un coté ça me permet de réutiliser ma boite login en objet dans d'autres programmation.

M'enfin bon, il n'est pas exclu que ce cas de figure se représente en programmation, ce qui m'interpelle sur la faisabilité.

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

Re: [..] Deuxième Boucle while bloquant les évènements

#20

Message par Tlem »

Je ne comprend vraiment pas votre problématique.
Lors de l'affichage de la fenêtre de login, vous n'avez rien de spécial à faire, donc pourquoi compliquer les choses ?

En ce qui concerne le 3 des messages précédents, je parlais du paramètre parent de la commande GUICreate. :roll:
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é".
Répondre