Relancer programme si fermeture inopinée

Poser vos questions de programmation en AutoHotkey
KevinH
Posts: 5
Joined: 21 Mar 2018, 05:45

Relancer programme si fermeture inopinée

23 Apr 2018, 07:54

Bonjour,

Je souhaite garder un programme ouvert en permanence mais parfois à cause de bug celui se ferme inopinément. Comment crée un script en arrière-plan qui se chargerait de contrôler si le programme est ouvert et si ce n'est pas le cas de le relancer ?

Merci d'avance,

PS: c'est génial qu'il y a une partie francophone ici je découvre ce fabuleux logiciel open source et j'espère l'utiliser souvent !

A bientôt,

Kévin
A_AhkUser
Posts: 1147
Joined: 06 Mar 2017, 16:18
Location: France
Contact:

Re: Relancer programme si fermeture inopinée

26 Apr 2018, 13:16

Salut KevinH,
KevinH wrote: Je souhaite garder un programme ouvert en permanence mais parfois à cause de bug celui se ferme inopinément. Comment crée un script en arrière-plan qui se chargerait de contrôler si le programme est ouvert et si ce n'est pas le cas de le relancer ?
Tu peux tirer parti d'au moins trois commandes, au choix: WinWaitClose, Process et RunWait:
Déscription des commandes:

Pour répéter d'une série de commandes tu peux opter soit pour un timer et un Loop (une boucle). Si ton script est monofonctionnel et se borne à contrôler si le programme est fermé pour, le cas échéant, le relancer, une boucle fera très bien l'affaire - voici un exemple avec le bloc-notes et en utilisant la commande RunWait et une boucle:

Code: Select all

Loop
{
	RunWait, C:\Windows\System32\notepad.exe ; lance le bloc-notes et attend que celui-ci se ferme avant de poursuivre
	sleep, 3000 ; on attend 3 secondes (3000ms) avant de relancer le programme
	MsgBox, 4,, Relancer le programme? ; affiche un messagebox avec un bouton 'oui' et un bouton 'non'
	IfMsgBox No ; si le bouton 'non' a été sélectionné...
		ExitApp ; ...on quitte le programme
	; dans le cas contraire... la boucle se poursuit
}
my scripts
KevinH
Posts: 5
Joined: 21 Mar 2018, 05:45

Re: Relancer programme si fermeture inopinée

27 Apr 2018, 07:32

Merci pour ta réponse je pense que winwaitclose peut faire l'affaire.

Dans mon cas, le logiciel bug mais le processus reste ouvert, il faut fermer de force les fenêtres, le processus puis relancer le programme en se loguant.
J'avais fait trois codes/boucles, un pour fermer le programme en cas de bug, un pour fermer le processus associé si le programme était fermé et un pour lancer le programme si le processus est correctement fermé.

Loop
{
IfWinExist, XXX,&Fermer 'boite de message suite à bug
{
WinActivate
}
else
{
WinWait, XXX,&Fermer 'boite de message suite à bug
WinActivate
}
IfWinActive, XXX
Send {ENTER}

IfWinExist, Application Error 'boite de message suite à bug
{
WinActivate
}
else
{
WinWait, Application Error,&Fermer 'boite de message suite à bug
WinActivate
}
IfWinActive, Application Error
Send {ENTER}
}

Process, Close, ntvdm.exe 'pour fermer proprement le programme

Loop
{
IfWinExist, XXX, 'si le logiciel marche normalement ne rien faire
return
else
Process, Close, ntvdm.exe 'sinon fermer le processus
}


Loop
{
Process, WaitClose, XXX.exe 'une fois le processus fermé, relancer le programme
Run, C:\XXX.EXE
}

Quand j'ai le temps j'essayerai de le toiletter pour en créer un seul et faire un sorte qu'il reste ouvert même une fois qu'il a réussi à relancer le programme. Je pense que je pourrai simplifier le code en tuant le processus dès que la première boite de message de bug apparaît. Mais là je n'ai pas le temps de me pencher dessus :oops: !
User avatar
joedf
Posts: 8940
Joined: 29 Sep 2013, 17:08
Location: Canada
Contact:

Re: Relancer programme si fermeture inopinée

27 Apr 2018, 09:52

Je pense que c’est possible de vérifier si une application ne réponds plus avec IsHungAppWindow(hwnd)
https://msdn.microsoft.com/en-us/librar ... 85%29.aspx

Code: Select all

Hwnd := WinExist(“ahk_exe ntvdm.exe“)
Frozen:=DllCall(“IsHungAppWindow”,”int”, Hwnd)
If (Frozen)
MsgBox L’application ne répond plus.
Else
MsgBox L’application répond.
Image Image Image Image Image
Windows 10 x64 Professional, Intel i5-8500, NVIDIA GTX 1060 6GB, 2x16GB Kingston FURY Beast - DDR4 3200 MHz | [About Me] | [About the AHK Foundation] | [Courses on AutoHotkey]
[ASPDM - StdLib Distribution] | [Qonsole - Quake-like console emulator] | [LibCon - Autohotkey Console Library]
A_AhkUser
Posts: 1147
Joined: 06 Mar 2017, 16:18
Location: France
Contact:

Re: Relancer programme si fermeture inopinée

28 Apr 2018, 09:32

joedf wrote:Je pense que c’est possible de vérifier si une application ne réponds plus avec IsHungAppWindow(hwnd)
https://msdn.microsoft.com/en-us/librar ... 85%29.aspx
Nice joedf :thumbup:
Par contre il semble que l'autocorrect sur ton iPhone t'ait desservi sur ce coup-là :HeHe::

Code: Select all

MsgBox % (a:=Asc("“")) . " = " . (b:=Asc("""")) . " ? " . ((a = b) ? "oui" : "non")
if (Hwnd:=WinExist("ahk_exe ntvdm.exe"))
	Frozen:=DllCall("IsHungAppWindow","int", Hwnd)
; ...
@KevinH
Dans ce cas tu peux essayer de WinKill toutes les fenêtres du processus après les avoir ajouté à un groupe - par exemple avec notepad:

Code: Select all

run, notepad
run, notepad
SetTimer, waitForABug, 4000
/*
 Exécute la subroutine 'waitForABug' toutes les quatre secondes (si le bug fait son apparition à intervalle plutôt horaire, un timer
 est plus économe comparé à WinWait qui check toutes les 200ms), 4000ms permettant malgré tout au script de réagir assez rapidement
 après que le bug a lieu.
 */
return

waitForABug:
	if not (WinExist("XXX", "&Fermer")) ; si le messagebox apparaissant à la suite d'un bug n'existe pas...
return
	; ...dans le cas contraire...
	WinActivate
	WinWaitActive
	SendInput, {Enter}
	GroupAdd, fenetres, ahk_exe notepad.exe ; créer un groupe de fenêtres sur lesquelles il est possible d'opérer également par la suite
	WinClose, ahk_group fenetres ; ferme toutes les fenêtres appartenant au groupe 'fenêtres' et en l'occurrence au processus notepad
	; WinKill, ahk_group fenetres ; alternative
	; Process, Close, notepad.exe ; alternative
	run, notepad ; on relance le programme
	run, notepad
return

!x::ExitApp ; ALT+X > quitter le programme
!t::MsgBox,, XXX, &Fermer ; ALT+T > un messagebox 'de bug' pour tester
my scripts
KevinH
Posts: 5
Joined: 21 Mar 2018, 05:45

Re: Relancer programme si fermeture inopinée

04 May 2018, 11:09

merci pour vos retours, j'ai un peu de mal à tout suivre mais je vais m'accrocher, bon week-end !
KevinH
Posts: 5
Joined: 21 Mar 2018, 05:45

Re: Relancer programme si fermeture inopinée

04 May 2018, 11:21

En fait il bug lors d'une manip précise, j'ai voulu faire une boucle qui se stoppe dans le cas où le bug apparaît mais j'ai dû me tromper dans la syntaxe puisqu'elle se faire toujours même avant la fenêtre d'erreur :headwall: , la voici:

Loop,
{
ControlClick, Button1, MELODIE ahk_class #32770,, Left, 1, NA
IfWinExist, Application Error, &Fermer,
WinClose, Application Error
break
}
Si quelqu'un est intéressé pour m'aider plus en direct, on peux échanger par netviewer ou telegram ?

Merci d'avance !
KevinH
Posts: 5
Joined: 21 Mar 2018, 05:45

Re: Relancer programme si fermeture inopinée

04 May 2018, 11:26

joedf wrote:Je pense que c’est possible de vérifier si une application ne réponds plus avec IsHungAppWindow(hwnd)
https://msdn.microsoft.com/en-us/librar ... 85%29.aspx

Code: Select all

Hwnd := WinExist(“ahk_exe ntvdm.exe“)
Frozen:=DllCall(“IsHungAppWindow”,”int”, Hwnd)
If (Frozen)
MsgBox L’application ne répond plus.
Else
MsgBox L’application répond.
Merci Joe j'ai testé mais sans succès, si ça peut vous aider voici une capture d'écran: (à ne pas diffuser outre mesure c'est professionnel)
Attachments
Bug.png
Bug.png (91.2 KiB) Viewed 4161 times
A_AhkUser
Posts: 1147
Joined: 06 Mar 2017, 16:18
Location: France
Contact:

Re: Relancer programme si fermeture inopinée

05 May 2018, 01:17

Si la manip en question est la commande ControlClick suivante:

Code: Select all

ControlClick, Button1, MELODIE ahk_class #32770,, Left, 1,  NA
tu peux essayer quelque chose de ce genre:

Code: Select all

#NoEnv
#SingleInstance force
SetWorkingDir % A_ScriptDir
SendMode, Input
#Warn

GUI, Add, Button,, &Fermer
GUI, Show, Hide w300 h110, Application Error ; on crée une fenêtre d'erreur, initialement cachée
Gosub, MELODIE
return

subroutine:
	if not (WinExist("MELODIE ahk_class #32770")) ; si la fenêtre MELODIE n'existe pas...
return
	; ...dans le cas contraire...
	ControlClick Button1, MELODIE ahk_class #32770,, Left, 1, NA ; on fait la manip
	Random, nombreAleatoire, 0, 1 ; on génère un nombre aléatoire
	if (nombreAleatoire) ; si nombreAleatoire = 1 = BUG...
		GUI, Show ; on montre la fenêtre d'erreur initialement cachée pour simuler un bug
	WinWait, Application Error, &Fermer, 1
	if not (ErrorLevel) { ; si la fenêtre d'erreur apparaît en effet...
		MsgBox, 16,, BUG > on arrête le timer.
		WinClose
	SetTimer,, Off ; on arrête le timer
	}
return

!t:: ; ALT+T affiche le MsgBox MELODIE
MELODIE:
	SetTimer, subroutine, 3000 ; on lance le timer
	MsgBox, 4, MELODIE, test ; ALT+T affiche le MsgBox MELODIE
return

!x::ExitApp ; ALT+X > quitter le programme
Dans ton code, ta boucle ne fera jamais plus d'une itération: le break est exécuté dans tout les cas. Utilise des blocs d'instruction pour faire dépendre un ensemble d'instruction d'un If (par exemple):

Code: Select all

i := 0
Loop
{
	ToolTip % i++
	sleep, 400
	If WinExist("ahk_class Notepad")
	{ ; début du bloc d'instruction
		MsgBox, TEST
	break
	} ;  fin du bloc d'instruction
	
}
my scripts

Return to “J'ai besoin d'aide”

Who is online

Users browsing this forum: No registered users and 28 guests