Page 1 sur 2

[R] Sortie de boucle & plantage

Posté : lun. 12 mai 2014 17:06
par aulus
Bonjour,

De la GUI mère, j'appelle par un bouton la fonction créant et affichant une GUI fille dont je vous montre le code ci-dessous.
Un bouton [Quitter] appartenant à cette GUI fille termine la boucle et la GUI fille est détruite. Le programme se plante alors sur la GUI mère.

La boucle (qui fonctionne bien) affiche un mot latin puisé dans une base SQLite, laisse quelques secondes à l'utilisateur pour trouver sa traduction, puis affiche la réponse, laisse quelques secondes pour la lire, puis affiche un nouveau mot.
► Afficher le texte
Je vous remercie de m'éclairer sur la cause de ce plantage à la fermeture de la GUI fille.

Re: [..] sortie de boucle & plantage

Posté : lun. 12 mai 2014 17:27
par TommyDDR
Je vous conseille de créer vos gui en début de script et de les afficher / cacher quand vous en avez besoin (au lieu de la créer et supprimer à chaque appel à une fonction), vous gagnez en performance.

Même chose pour le _SQLite_Startup et _SQLite_Shutdown, je vous conseille de faire un startup en début de script et de mettre un OnAutoitExitRegister("exit_sqlite") et de créer la fonction exit_sql qui contiendra le _SQLite_Shutdown, de cette façon vous d'ouvrez la dll qu'une fois et vous êtes dur de la fermer (la dll ^^) lorsque le script sera quitté (regardez l'aide de OnAutoitExitRegister pour plus d'info)
► Afficher le texte
Pour ce qui est de votre problème de plantage, avez-vous la possibilité de fournir un code fonctionnel (cad un code que nous pouvons exécuter tel quel pour reproduire le plantage) ?

Re: [..] sortie de boucle & plantage

Posté : lun. 12 mai 2014 18:01
par mikell
TommyDDR a écrit :de cette façon vous d'ouvrez la dll qu'une fois et vous êtes dur de la fermer
Tu es enrhumé Tommy ? :mrgreen:

Re: [..] sortie de boucle & plantage

Posté : lun. 12 mai 2014 18:07
par Tlem
Non non, il est enrubé enrudé ... :lol:

Re: [..] Sortie de boucle & plantage

Posté : lun. 12 mai 2014 18:29
par jchd
Soyez pas rudes avec Tommy.

J'ajouterais aussi qu'il est suffisant d'ouvrir la base au début du programme et de la fermer (la base !) à la fin.
La bonne séquence est donc :

Code : Tout sélectionner

 _SQLite_Startup(...)
_SQLite_Open(...)

... corps du programme

_SQLite_Close(...)
_SQLite_Shutdown()

Re: [..] sortie de boucle & plantage

Posté : lun. 12 mai 2014 19:51
par aulus
TommyDDR a écrit : Pour ce qui est de votre problème de plantage, avez-vous la possibilité de fournir un code fonctionnel (cad un code que nous pouvons exécuter tel quel pour reproduire le plantage) ?
J'ai réduit mon programme originel, mais je l'ai tellement réduit que la fonction Memoriser() ne se lance pas. Je ne vois pas pourquoi.
► Afficher le texte

Re: [..] Sortie de boucle & plantage

Posté : lun. 12 mai 2014 23:17
par mikell
J'ai simplifié ton code au max pour isoler le problème et je vois pas pourquoi, mais il semble que la boucle dans la fonction Memoriser() bloque l'exécution du GUICtrlSetOnEvent, c'est très facile à vérifier en manipulant le code cy-dessous
► Afficher le texte
Si quelqu'un a la réponse je prends (peut-être un GuiRegisterMsg ?)
En attendant je ne peux que te suggérer de trouver une solution alternative à cette boucle, un AdLibRegister par exemple :?

Re: [..] Sortie de boucle & plantage

Posté : lun. 12 mai 2014 23:25
par TommyDDR
Voici votre code en un peu plus organisé pour y voir plus clair et en utilisant un AdlibRegister.
Si vous voulez des explication demandez moi.
► Afficher le textecode
Edit : Mikell... :evil:
Edit 2 : Le plus gros problème était que le GUIOnEventMode se situait après la while 1 ^^' donc nous n'étions pas en mode évenementiel.

Re: [..] Sortie de boucle & plantage

Posté : lun. 12 mai 2014 23:50
par mikell
Hum, dans mon petit code de diagnostic Opt("GUIOnEventMode", 1) est en tête de script et ça merdoie derechef :?
Ta solution est impec avec son AdLibRegister, mais j'aimerais bien savoir le pourquoi du comment de cette histoire de boucle
Félicitations pour cette prompte guérison

Re: [..] Sortie de boucle & plantage

Posté : mar. 13 mai 2014 08:33
par aulus
Bonjour,

Au vu de la complexité de la chose, je comprends que toutes mes heures passées à cogiter et à tester aient été si nombreuses et sans succès... Je ne pouvais pas m'en sortir.
Je vais appliquer votre code à mon programme durant l'après-midi... Je vous tiendrai au courant.

Grand merci.

Re: [..] Sortie de boucle & plantage

Posté : mar. 13 mai 2014 09:27
par TommyDDR
Si mes souvenirs sont bons, les messages des GUICtrlSetOnEvent ne sont reçu que lorsque nous nous situons dans la boucle principale, un clic enverra bien le message, mais la fonction associée ne sera appelée qu'au retour à la boucle infinie.

Tu peux tester en remplaçant :

Code : Tout sélectionner

;~ While $arret = 0
;~  sleep (10)
;~ Wend
Par :

Code : Tout sélectionner

sleep (5000)
Lance le script, clique sur Memoriser puis sur quitter dans la foulée et attends
Tu verras que rien ne se passe tant qu'on est dans la fonction memoriser et une fois que le sleep est terminé, la fonction se lance.

Re: [..] Sortie de boucle & plantage

Posté : mar. 13 mai 2014 11:49
par TommyDDR
Humm... ce script fonctionne pourtant bien...
► Afficher le textecode
EDIT : Ok j'ai compris ! Un evenement n'est déclenché qu'après que l’événement d'avant ai fait sont retour. Ici, l'appel à mémoriser est fait avec un OnEvent donc, tant que celui-ci n'est pas terminé, les events se mettent dans une file en attente.

Re: [..] Sortie de boucle & plantage

Posté : mar. 13 mai 2014 11:54
par GaRydelaMer
Bonjour

la solution c'est d'utiliser:
GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
est de modifier la variable globale $Arret dans cette fonction si on clique sur le bouton.

Re: [..] Sortie de boucle & plantage

Posté : mar. 13 mai 2014 12:14
par TommyDDR
Je tiens à préciser qu'il n'est pas très propre de mettre des boucles infinies dans des fonctions appelés par GUICtrlSetOnEvent, vous pouvez toujours vous débrouiller autrement.

Re: [..] Sortie de boucle & plantage

Posté : mar. 13 mai 2014 20:49
par mikell
TommyDDR a écrit :Je tiens à préciser qu'il n'est pas très propre de mettre des boucles infinies dans des fonctions appelés par GUICtrlSetOnEvent
C'est pas faux, surtout si on peut plus sortir de ces boucles
Gary est peut-être un brin catégorique en affirmant que GUIRegisterMsg est LA solution (surtout sans proposer de code) mais dès que j'ai un moment j'essaie ça

Re: [..] Sortie de boucle & plantage

Posté : mar. 13 mai 2014 22:52
par GaRydelaMer
Je confirme que c'est la solution, car en mode événementiel et l'utilisation de de boucle infini c'est la seule solution proposer par AutoIt pour interpréter des messages que windows va envoyer.
Voila du code pour jouer avec les 2 cas commente la ligne GUIRegisterMsg. Dans un autre cas commente la boucle dans la fonction.
► Afficher le texte

Re: [..] Sortie de boucle & plantage

Posté : mar. 13 mai 2014 22:53
par mikell
Merchi :mrgreen:
aulus tu as ta solution

Re: [..] Sortie de boucle & plantage

Posté : mar. 13 mai 2014 23:00
par GaRydelaMer
De rien ^^

Tu peux aussi commenter l'association des événements des boutons, le click sur le bouton est géré dans la fonction My_WM_Command.
Autre point, pendant que la boucle tourne, tu peux même pas fermer la fenêtre mais AutoIt va le garder en file d'attente (teste en cliquant sur la croix, puis clicke le bouton stop).

Edit:
Remarque aussi l'utilisation des macros @GUI_WinHandle dans la fonction GUIS_Close(), il y'en a d'autre à utiliser dans le mode événementiel.
@GUI_CtrlHandle
@GUI_CtrlId

Re: [..] Sortie de boucle & plantage

Posté : mar. 13 mai 2014 23:20
par mikell
C'est beau ... Image

Re: [..] Sortie de boucle & plantage

Posté : mar. 13 mai 2014 23:33
par jchd
N'y a-t-il pas une échappatoire plus simple en utilisant le (tout récent) qualificatif Volatile pour les fonction "OnEvent" ?
C'est une question, pas une piste. Pour tout dire ces prises de têtes d'IHM me gonflent les choses autant que les joues du chaton...