Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Éviter le double lancement d'un programme. | |
| | Auteur | Message |
---|
Invité Invité
| Sujet: Éviter le double lancement d'un programme. Mer 3 Fév 2016 - 20:28 | |
| J'ai mis en inutilitaire, car j'espère que ce problème de voir un programme se relancer une fois fini, est provisoire. - Code:
-
repeat pause 200 until scancode = 19 :' appuyer sur la touche pause terminate end Constamment j'avais ce problème de double démarrage, et je ne pouvais pas voir le contenu des memos et edits, sans être obligé de recommencer le remplissage. Là ça marche. La boucle repeat/until agit comme un end, et la pause de 200 fait que le procésseur ne travail guère plus que si le programme est fermé. Ah oui, il est évident que le END est inutile à la fin. Il y est, il y reste. |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Éviter le double lancement d'un programme. Mer 3 Fév 2016 - 23:29 | |
| Astuce intéressante, Cosmos70. A garder dans la librairie des astuces. | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Éviter le double lancement d'un programme. Ven 12 Fév 2016 - 13:56 | |
| @cosmos70 J'imagine que tu utilises cette astuce quand tu es dans le cas de débogage, sans erreur dans le source, mais dans le cas d'un arrêt inopiné, ton astuce ne fonctionne plus. Voici la mienne: Pour que ça marche, il faut "planter" le 1er démarrage, pour cela il faut par exemple créer un... ACCESS VIOLATION !!! Pour une fois, il va nous servir celui-là Dans le lanceur, j'ajoute une ligne avant la commande 'execute', comme ceci: lanceur: - Code:
-
if file_exists("check_if_running.txt")=1 then file_delete "check_if_running.txt" execute "PANORAMIC.EXE " + source$
et dans le source, au tout début, à la ligne 1: source: - Code:
-
if file_exists("check_if_running.txt")=0 file_open_write 1,"check_if_running.txt" : file_close 1 poke 1,0 terminate end_if
Au 1er démarrage, le message "ACCESS VIOLATION" apparait, mais le second se passe normalement. Ce n'est pas très élégant, mais ça marche bien. Le 'terminate' ne sert à rien, car dès que le plantage a lieu, PANORAMIC.EXE relance immédiatement le source, mais je le laisse par sécurité. EDIT:EUREKA! Ca marche nickel, plus besoin de créer un 'access violation'!!! C'est beaucoup mieux ainsi: - Code:
-
if file_exists("check_if_running.txt")=0 file_open_write 1,"check_if_running.txt" : file_close 1 dll_on "user32" : dim n% n%=dll_call1("DestroyWindow",handle(0)) dll_off panel 1 : delete 1 end end_if
Pouvez vous me dire si ça fonctionne chez vous également? EDIT2: ajout de 'dll_off' dans le code | |
| | | Invité Invité
| Sujet: Re: Éviter le double lancement d'un programme. Ven 12 Fév 2016 - 18:21 | |
| Bonjour Silverman.
Je viens de terminer un problème. J'ai ramoné ma cheminée ce matin avec des cannes, et mon hérisson est resté dedans. J'ai réussi à l'enlever depuis le toit, et j'ai encore du mal à rentrer dans les problèmes de code.
Je regarde tes sources, mais j'ai du mal de comprendre. Apparemment tu essayes de faire autre chose. Pour ma part, le but du programme était d'éviter que le source se relance une fois qu'il est déjà exécuté, et se ferme. C'est une chose qui se produit presque à chaque fois.
Ce programme fonctionne, mais avec l'éditeur de Klaus, il y a un problème. Si je lance Synedit Editor, et que panoramic.exe est encore actif même si il a disparu de la barre de tâche, Synedit plante. Pourquoi ça plante? Car j'ai tendance à fermé le programme avec la croix par habitude, alors qu'il y a une boucle repeat/until dont la sortie est la touche pause. Ce qui fait que dans ce cas précis, Panoramic.exe n'a pas complètement disparu. Il a fermé, mais reste dans le gestionnaire de tâches. Pour résoudre ce problème, j'ai mis border_hide, et je marque la fenêtre en rouge à la fin, pour me rappeler que je dois cliquer sur pause pour sortir. A partir de là ça marche.
Si j'ai bien compris, ton problème est de fermer panoramic.exe après un acces violation, ce qui est un autre problème. J'ai essayé tes codes mais je ne sais pas quelles sont les lignes qu'il y a avant. Ca doit fermer quoi sur une erreur, mais là ...
J'essaye plusieurs trucs, et remplacé ma méthode par la tienne. Il lance mon programme, et je vois 2 icônes de Panoramic dans la barre de tâche. apparemment ça na pas l'air de marché, j'ai encore 2 lancements du programme, et il en reste un une fois fini, même en cliquant sur le message "cannot open file... occupé par un autre programme". Surement que tu essayes autre chose.
Malheureusement je ne peux pas rester plus. |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Sam 13 Fév 2016 - 17:06 | |
| Je ne voudrais pas avoir l'air d'ergoter... Mais si c'est une astuce utile, alors ce n'est pas un inutilitaire, qui (par définition) ne sert à rien !? Non ? | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Éviter le double lancement d'un programme. Sam 13 Fév 2016 - 18:40 | |
| C'est tout à fait le bon sens Martien! | |
| | | Invité Invité
| Sujet: Re: Éviter le double lancement d'un programme. Sam 13 Fév 2016 - 18:48 | |
| Au départ je n'étais pas sûre qu'on voit les choses de la même façon que moi. Le double lancement, je l'ai constamment, mais il y a des périodes où le problème n’apparait pas. J'ai pris l'habitude avec Panoramic d'être prudent. Plus d'une fois un problème que je poste n'ai pas vu chez les autres. Ensuite j'espère bien que Jack a le soucis de chercher pourquoi cela se produit. On en a déjà parlé, mais maintenant plus personne ne s'en préoccupe. J'espère que le code que j'ai posté n'est que provisoire, donc une fois résolu, ce code devient inutile! |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Éviter le double lancement d'un programme. Sam 13 Fév 2016 - 20:11 | |
| Le double lancement, mon lanceur "ne connais plus ça" avec le code que j'ai posté plus haut, sous le EDIT rouge. Il faut juste prendre la précaution d'utiliser un nom de fichier absolu pour "check_if_running.txt". Ce fichier est en permanence créé ou effacé dans le dossier du lanceur, quelquesoit le source que j'éxécute. Plus exactement, le premier lancement est tué dans l'oeuf; il apparait quelques millisecondes puis disparait pour laisser place au lancement final. C'est si rapide que c'est invisible. Maintenant, on a tous des OS et des machines différentes, alors pour ce bug précis, ce qui fonctionne chez les uns ne fonctionne pas forcément chez les autres. Il n'y a eu que peu de retour sur l'astuce de cosmos70 ou la mienne, donc on ne peut pas classer ça dans les utilitaires si on ne sait pas si ça marche vraiment.
NB: le double lancement n'affecte que les personnes qui utilise 'panoramic.exe' pour créer des IDE par exemple, afin d'éxécuter des codes sources. 'Panoramic_editor' n'est pas concerné. | |
| | | Invité Invité
| Sujet: Re: Éviter le double lancement d'un programme. Dim 14 Fév 2016 - 2:27 | |
| Je ne peux rien dire sur ton programme. Ca ne fonctionne pas chez moi, mais j'utilise Synedit_Editor, et je ne sais pas comment est fait le lancement. J'ai essayé ton programme, et là il se lance une nouvelle fois à chaque fermeture. J'avais 5 icônes dans la barre de tâches, mais c'est peut-être particulier. Par contre, j'ai essayé une amélioration de mon programme qui ne bloque plus Synedit par un clic irréfléchie sur la croix de fermeture de la fenêtre. Donc j'ai retiré border_hide sur la fenêtre 0, et voici le code: - Code:
-
label fin
' tableur(): programme en cours on_close 0,fin caption 0, "appuyer sur pause":beep : ' devient inutile repeat pause 500 until scancode = 19 or clicked(0) = 1:' appuie sur la touche pause
fin: execute "C:\PANO\kill_pano.exe" :' programme que l'un d'entre-vous a développé. ' terminate ' end Le programme est lancé et est arrête par la repeat/until, et sert de END. Si on met des boutons, ou autres, les évènements fonctionnent. En fermant la fenêtre, le programme kill_pano développé je ne sais plus , par JL35 ou Papydall, nettoie le gestionnaire de tâches de Panoramic, et Synedit_Editor n'est plus perturbé. |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Éviter le double lancement d'un programme. Dim 14 Fév 2016 - 2:53 | |
| - cosmos70 a écrit:
- En fermant la fenêtre, le programme kill_pano développé je ne sais plus , par JL35 ou Papydall, nettoie le gestionnaire de tâches de Panoramic, et Synedit_Editor n'est plus perturbé.
C’est bien moi l’auteur du code. Je l’ai posté iciA toute fin utile, je rappelle ce code - code:
- Code:
-
rem ============================================================================ rem Tuer toutes les instances en cours d un même programme rem ============================================================================ rem Exemple d utilisation rem Dans cet exemple, on ouvre 4 instances du même programme : calc.exe rem Ces instances sont en cours d exécution. rem Nous allons les "tuer" toutes en faisant appel à KillProcess(process$) rem en transmettant la chaîne "calc.exe" comme valeur du paramètre process$ rem Le programme (Panoramic.exe) est en cours d exécution normale. rem Nous allons le "tuer" lui aussi et toutes ses éventuelles instances. rem ============================================================================ rem REMARQUE: rem Peu importe que les processus soient en cours d exécution normale, rem qu ils soient entrés en boucle infinie, ou qu ils aient planté. rem ============================================================================ ' On ouvre 4 instances du programme de la calculatrice execute "calc.exe" execute "calc.exe" execute "calc.exe" execute "calc.exe" pause 100 message "Les 4 instances du processus 'Calc.exe' seront tuées, après fermeture de ce message" ' On tue toutes les instances du programme KillProcess("calc.exe") message "Le processus 'Panoramic.exe' sera tué, après fermeture de ce message" ' On tue enfin toutes les instances de Panoramic.exe KillProcess("panoramic.exe") end rem ============================================================================ SUB KillProcess(process$) dim_local d$,f$,g$,slash$ d$ = "c:\temp\" f$ = d$ + "KillProcess.vbs" g$ = chr$(34) : slash$ = chr$(92) FILE_OPEN_WRITE 9999, f$ file_writeln 9999, "strComputer = "+g$+"."+g$ file_writeln 9999, "strProcessKill = "+g$+"'"+process$+"'"+g$ file_writeln 9999, "Set objWMIService = GetObject("+g$+"winmgmts:"+g$+" _" file_writeln 9999, "& "+g$+"{impersonationLevel=impersonate}!"+slash$+slash$+g$+" & strComputer & "+g$+"\root\cimv2"+g$+")" file_writeln 9999, "Set colProcessList = objWMIService.ExecQuery _" file_writeln 9999, "("+g$+"Select * from Win32_Process Where Name = "+g$+" & strProcessKill )" file_writeln 9999, "For Each objProcess in colProcessList" file_writeln 9999, "objProcess.Terminate()" file_writeln 9999, "Next" file_writeln 9999, "WSCript.Echo "+g$+"Process tué : "+g$+" & strProcessKill" file_writeln 9999, "WScript.Quit"
FILE_CLOSE 9999 EXECUTE_WAIT f$ FILE_DELETE f$
END_SUB rem ============================================================================
| |
| | | Contenu sponsorisé
| Sujet: Re: Éviter le double lancement d'un programme. | |
| |
| | | | Éviter le double lancement d'un programme. | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |