[R] Sortie de boucle & plantage

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

[R] Sortie de boucle & plantage

#1

Message 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.
Modifié en dernier par aulus le mer. 14 mai 2014 13:59, modifié 3 fois.
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2128
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] sortie de boucle & plantage

#2

Message 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) ?
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] sortie de boucle & plantage

#3

Message 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:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] sortie de boucle & plantage

#4

Message par Tlem »

Non non, il est enrubé enrudé ... :lol:
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
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Sortie de boucle & plantage

#5

Message 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()
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] sortie de boucle & plantage

#6

Message 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
Modifié en dernier par aulus le jeu. 15 mai 2014 07:25, modifié 1 fois.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Sortie de boucle & plantage

#7

Message 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 :?
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2128
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] Sortie de boucle & plantage

#8

Message 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.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Sortie de boucle & plantage

#9

Message 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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Sortie de boucle & plantage

#10

Message 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.
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2128
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] Sortie de boucle & plantage

#11

Message 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.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2128
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] Sortie de boucle & plantage

#12

Message 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.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Sortie de boucle & plantage

#13

Message 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.
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2128
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] Sortie de boucle & plantage

#14

Message 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.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Sortie de boucle & plantage

#15

Message 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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Sortie de boucle & plantage

#16

Message 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
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Sortie de boucle & plantage

#17

Message par mikell »

Merchi :mrgreen:
aulus tu as ta solution
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Sortie de boucle & plantage

#18

Message 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
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Sortie de boucle & plantage

#19

Message par mikell »

C'est beau ... Image
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Sortie de boucle & plantage

#20

Message 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...
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Répondre