Page 1 sur 1
[..] Exécution de plusieurs partie de script parallèlement
Posté : mer. 22 janv. 2014 18:01
par guigui54
Bonjour à tous !
J'ai décidé après avoir laissé l'Autoit un peu de coté de m'y remettre pour faire un me faire un nouveau programme mais je me suis confronté à un problème que je ne sait plus résoudre
J'ai cherché sur internet, les différentes aides du site et d'autres mais sans succès peut être par le fait que je ne sais pas bien formuler ma recherche ou bien je ne sais quoi mais bon j'en suis arrivé à demander l'aide d'autres.
Mon programme est organisé en plusieurs parties dont certaines avec des GUI. Je voudrais donc savoir si quelqu'un savait comment même si on fait s'afficher une msgbox ou une GUI, faire en sorte que cela ne bloque pas le déroulement du script et que celui-ci continue son fonctionnement normal même si je ne quitte pas la msgbox par exemple. Cela m'aiderait vraiment car la GUI que je lance au départ doit rester jusqu’à la fin de mon script et actuellement après l'avoir lancée le script ne fait plus rien donc c'est assez gênant.
Merci de votre lecture et de votre aide
Re: Exécution de plusieurs partie de script parallèlement
Posté : mer. 22 janv. 2014 18:52
par Hugues
Bonjour,
Il ne faut pas utiliser une MsgBox car c'est une fonction bloquante (attente intervention de l'utilisateur) si tu veux que ton script ne soit pas stoppé.
Tu peux utiliser le SplashTextOn() si tu veux.
Essaie ça, c'est peut-être pas ce que tu recherches...
► Afficher le texte
Code : Tout sélectionner
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
global $Button1
_MainGUI()
Func _MainGUI()
$MainGUI = GUICreate("", 332, 157, 235, 139)
$Button1 = GUICtrlCreateButton("Button1", 8, 16, 75, 25)
GUISetState(@SW_SHOW)
EndFunc
Func _MaFonction()
For $i = 10 To 0 Step -1
ConsoleWrite($i & @CRLF)
Sleep(1000)
Next
EndFunc
While 1
$Msg = GUIGetMsg()
Select
Case $Msg = $GUI_EVENT_CLOSE
Exit
Case $Msg = $Button1
SplashTextOn("", "Tu as cliqué sur le bouton" & @CRLF & "Lancement compteur", 300, 100, -1, -1)
_MaFonction()
SplashOff()
EndSelect
WEnd
PS: Rajoutes [..] dans ton entête de sujet -> [..] Exécution de plusieurs partie de script parallèlement

Re: [..] Exécution de plusieurs partie de script parallèleme
Posté : mer. 22 janv. 2014 19:57
par guigui54
Je connaissais déjà la fonction SplashTextOn merci quand même mais elle ne convient pas à l'utilisation que je voudrais donner, j'aurai du mettre un exemple pour étayer mes dires, je me suis mal débrouillé. J'ai donc bricolé vite fait un exemple dans lequel d'une part après l'affichage de la GUI (ici fait avec koda pour aller vite) le script ne s'exécutera pas (ici je n'ai pas mis de lien entre la GUI et le script mais dans le mien il y en a un car j'ai mis sur la GUI un compteur pour le temps) et même si je l'exécute indépendamment dès que le compteur tombe à 99, une msgbox apparaît mais tant que je ne l'aie pas quittée, le compteur ne défile plus alors que je le voudrais.
► Afficher le texte
Code : Tout sélectionner
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Date.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 212, 159, 192, 124)
$Label1 = GUICtrlCreateLabel("Exemple ", 48, 8, 113, 33)
GUICtrlSetFont(-1, 18, 800, 0, "MS Sans Serif")
$Button1 = GUICtrlCreateButton("Valider", 32, 80, 145, 65)
GUISetState(@SW_SHOW)
#EndRegion
Global $Jour
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Trouvelejour ()
Func Trouvelejour ()
$Jour = _DateToDayOfWeek ( @YEAR , @MON , @MDAY )
Determine ()
EndFunc
Func Determine ()
If $Jour = 1 Then $Temp = 3600
If $Jour = 2 Then $Temp = 2000
If $Jour = 3 Then $Temp = 2000
If $Jour = 4 Then $Temp = 2000
If $Jour = 5 Then $Temp = 2000
If $Jour = 6 Then $Temp = 2000
If $Jour = 7 Then $Temp = 3600
Descente ()
EndFunc
Func Descente ()
$Jour = $Jour - 1
Sleep (100)
Sauvetage ()
EndFunc
Func Sauvetage ()
If $Jour < 100 Then MsgBox (0, "bravo","tu as réussi")
EndFunc
Merci beaucoup de ta réponse très rapide
Re: [..] Exécution de plusieurs partie de script parallèleme
Posté : mer. 22 janv. 2014 21:34
par Hugues
Sans être indiscret, il consiste en quoi ton programme pour que je puisse mieux comprendre stp?
Tu veux récupérer le jour de la semaine, mais pour en faire quel traitement?
Re: [..] Exécution de plusieurs partie de script parallèleme
Posté : mer. 22 janv. 2014 22:50
par Tlem
Bonsoir guigui54.
Lorsque vous affichez une GUI, celle-ci restera affichée tant que votre script ne se fermera pas et ça c'est le rôle de la boucle infinie While/Wend.
Si vous écrivez du code (en dehors d'une fonction) après cette boucle, il est évident que celui-ci ne s'exécutera pas. Vous devez faire en sorte que le code qui doit être exécuté, le soit avant la boucle, ou dans la boucle. Là comme ca c'est assez difficile de vous aider plus puisque nous ne connaissons rien de votre script. ^^
Concernant la MsgBox, celle-ci est effectivement bloquante si elle est appelé tel quel. Pour faire en sorte quelle ne le soit pas, il faut "l'appeler de l'extérieur" (en créant un nouveau processus), mais il n'y a vraiment aucun intérêt d'afficher une MsgBox ci c'est pour passer outre. Dans ce cas faites des fenêtres filles (mais il faudra une gestion béton des événements GUI).
Re: [..] Exécution de plusieurs partie de script parallèleme
Posté : mer. 22 janv. 2014 23:33
par mikell
Voilà un exemple de msgbox perso non-bloquante, mais attention s'il y a lancement de nouvelles fonctions elles seront bloquantes pour les autres fonctions en cours
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
Opt("GuiOnEventMode", 1)
Global $stop, $gui, $confirm, $b2
$gui = GUICreate("My GUI", 120, 100, -1, 200)
GUISetOnEvent($GUI_EVENT_CLOSE, "_close")
$label = GUICtrlCreateLabel("", 30, 30, 50, 20)
$btn = GUICtrlCreateButton("stop", 30, 70, 50, 20)
GUICtrlSetOnEvent(-1, "_confirm")
GUISetState()
For $i = 1 to 1000
If $stop Then Exitloop
GuiCtrlSetData($label, $i)
Sleep(300)
Next
Msgbox(0,"", "stopped !")
Func _stop()
$stop = 1
EndFunc
Func _confirm()
$confirm = GUICreate("My box", 170, 70)
GUISetOnEvent($GUI_EVENT_CLOSE, "_close")
GUICtrlCreateLabel("voulez-vous vraiment arrêter ?", 10, 10, 150, 20)
$b1 = GUICtrlCreateButton("voui", 30, 40, 50, 20)
GUICtrlSetOnEvent(-1, "_stop")
$b2 = GUICtrlCreateButton("nan", 90, 40, 50, 20)
GUICtrlSetOnEvent(-1, "_close")
GUISetState()
EndFunc
Func _close()
If @GUI_WinHandle = $gui Then Exit
If @GUI_WinHandle = $confirm OR @GUI_CtrlId = $b2 Then GuiDelete($confirm)
EndFunc
Re: [..] Exécution de plusieurs partie de script parallèleme
Posté : jeu. 23 janv. 2014 02:13
par jchd
On peut aussi passer en mode OnEvent pour ne pas bloquer le programme principal, mais bien sûr toute MsgBox est proscrite.
Re: [..] Exécution de plusieurs partie de script parallèleme
Posté : jeu. 23 janv. 2014 18:43
par guigui54
J'ai vu Hugues que tu vouais connaître l'utilité de mon script, ça ne me dérange pas, je vais vous l'expliquer: je souhaite pouvoir en quelque sorte organiser mon temps suivant un schéma répétitif en fonction du jour de la semaine qu'on est. J'ai pour cela mis une GUI avec un compteur de temps décroissant avec une durée de départ qui dépend de ce même jour qu'il est et je souhaiterai qu'au bout de certaines durées précises une boite de dialogue (je pensais mettre une msgbox) s'affiche pour me dire par exemple "cela fait 30 minutes que tu fais ça ...." mais dans le cas où je ne verrai pas la boite de dialogue je ne voudrait pas que le chronomètre s'arrête, de plus je ne veut pas à devoir lancer manuellement le compte à rebours, c'est pour cela que je souhaite le lancer dès le démarrage de l'ordi (en le plaçant dans le dossier démarrer).
Donc mes deux problèmes sont que le compteur reste à la durée maximum après lancement du programme donc c'est pas super et et même si j'enlève la GUI après que la première msgbox s'allume, le compteur s’arrête.
Re: [..] Exécution de plusieurs partie de script parallèleme
Posté : jeu. 23 janv. 2014 19:18
par mikell
Si tout ce que tu veux c'est une boite de dialogue d'alerte qui ne bloque pas le reste du script, une petite adaptation de mon code précédent fera l'affaire ^^
Re: [..] Exécution de plusieurs partie de script parallèleme
Posté : jeu. 23 janv. 2014 20:42
par guigui54
Merci beaucoup mikell pour ton aide j'ai un peu modifié ton code pour l'adapter à mon programme et ca marche, il me manque plus qu'a trouver comment afficher dès le départ ma première GUI avec le compteur décroissant et qu'elle reste en place jusqu’à la fin du déroulement du programme et ce sans bloquer le déroulement de ce dernier.
Re: [..] Exécution de plusieurs partie de script parallèleme
Posté : jeu. 30 janv. 2014 12:05
par sksbir