Langage de programmation (fermer/suicider un processus)

Informatique - NTIC - Web 2.0 - Robotique - Mathématiques - Bioéthique
Mac
Tribunus plebis
Tribunus plebis
Messages : 3962
Inscription : lun. 09 févr. 2009, 23:40
Localisation : la Réunion

Langage de programmation (fermer/suicider un processus)

Message non lu par Mac »

Christophe67 a écrit :Assez sommairement, je peux développer quelques applis personnelles en QT ou Borland C++, mais pas de façon poussée. Ayant du abandonner assez récemment le delphi pascal (que je maitrisais suffisamment pour développer des applis pros), j'en tâte quelques fois par pure curiosité; mais je me concentre plus sur le développement de sites (php, pdo, jquery, scss ...) et ces derniers temps aux techniques graphiques WebGL qui me passionnent.Cordialement.
Je vous posais la question car j'ai un programme en C++ que je dois poursuivre.
Et est-ce que vous savez comment arrêter un processus (par VBS de préférence).
Parce que je sais le faire par VBS sauf que certains processus du type "nom_du_processus *32" ne s'arrête pas. Donc je pensais à les arrêter automatiquement (au bout de 5 à10 sec ) soit par une programme C++ soit VBS.

Fraternellement. :coeur:
Avatar de l’utilisateur
Christophe67
Barbarus
Barbarus

Re: langage de programmation

Message non lu par Christophe67 »

Bonjour Mac


Pour éviter d'avoir à réinventer la roue le plus simple serait de faire appelle à l'API Windows: TerminateProcess .
Si c'est juste pour tuer un processus dont le nom est connu, ou par son ID, on peut procéder ainsi :

1- Récupérer l'ID du processus avec l'API Windows : GetWindowThreadProcessId en déterminant ou récupérer le handle de la fenêtre.
2- Ensuite tuer le processus avec TerminateProcess.

Sous Delphi je procéderais différemment en utilisant OpenProcess, avec la constante PROCESS_TERMINATE et une variable HProc pour recevoir le handle du processus à tuer. Puis TerminateProcess.


Cordialement.
Mac
Tribunus plebis
Tribunus plebis
Messages : 3962
Inscription : lun. 09 févr. 2009, 23:40
Localisation : la Réunion

Re: langage de programmation

Message non lu par Mac »

Christophe67 a écrit :Pour éviter d'avoir à réinventer la roue le plus simple serait de faire appelle à l'API Windows: TerminateProcess .
Si c'est juste pour tuer un processus .... Puis TerminateProcess.
Cordialement.
1) Qu'est-ce que le handle( de la fenêtre)? Malgré mes recherches je n'ai pas pu comprendre ce que cela veut dire, ou représente car les informations étaient imprécises.

2) TerminateProcess c'est ce que je fais et qui fonctionne pour les processus Windows mais le processus que je dois arrêter n'est pas un processus Windows et du coup terminateProcess ne marche pas.

Donc :
soit il y a une façon d'arrêter les processus non Windows grace à TerminateProcess et ce serait le plus simple pour moi.
Soit je suis amené à fermer mon programme (écrit en c++) automatiquement 5 ou 10 secondes après son lancement.

Delphi je ne connais pas, ça m'a l'air passionnant. :D
Et en Delphi vous arrêtez les processus qui ne sont pas ceux de window?

Fraternellement. :coeur:
Avatar de l’utilisateur
Christophe67
Barbarus
Barbarus

Re: langage de programmation

Message non lu par Christophe67 »

Bonsoir Mac,

Je ne suis pas certain de comprendre par : processus non Windows.

Est ce un processus sous un autre système d'exploitation (Macintosh, Linux ...), ou un processus d'un programme tiers non inclus à Windows, ou fonctionnant sous émulation ( Wyse par exemple, émulation Windows sous Linux ) ?

Il me semble comprendre que vous souhaitez tuer le processus de votre propre programme.

Est-ce pour le fermer à partir d'un autre programme ?
Est-ce que en quittant le programme, le processus reste présent et vous souhaitez le faire disparaître ?
Est-ce que dans votre programme vous créez un thread qui reste actif après la fermeture du programme ?


Voici un lien sur l'API Windows TerminateProcess qui vous aidera à comprendre ce que j'appelle Handle (un pointeur sur le processus à tuer demandé en paramètres), ainsi qu'un exemple C++ de ce que je ferai en Delphi en utilisant OpenProcess.

Voici un exemple très simple en Delphi Pascal qui tue notre propre processus en cliquant sur un bouton. Je pense qu'il est très facilement applicable en C++, et est plus simple d'utilisation à condition que ce soit notre propre programme qui veuille se terminer.

Je reconnais ne pas être toujours clair dans mes explications ayant tendance à utiliser un langage de coder :oops: , j'espère que l'exemple en réponse 1 sera plus explicite.


Cordialement.
Dernière modification par Christophe67 le lun. 18 mai 2015, 23:54, modifié 1 fois.
Avatar de l’utilisateur
Christophe67
Barbarus
Barbarus

Re: langage de programmation

Message non lu par Christophe67 »

J'ai oublié de répondre à une question, j'entendais par Handle de la fenêtre un pointeur sur une fenêtre ( par exemple la fenêtre avec pour titre 'Sans titre - Bloc-notes' pour le processus Notepad.exe) qui permet à partir de celui-ci de pointer sur son processus.
Cela évite de lister tous les processus, de trouver le PID correspondant puis de le fermer.


Cordialement.
Avatar de l’utilisateur
Fée Violine
Consul
Consul
Messages : 13106
Inscription : mer. 24 sept. 2008, 14:13
Conviction : Catholique ordinaire. Laïque dominicaine
Localisation : France
Contact :

Re: langage de programmation

Message non lu par Fée Violine »

[petit hors sujet : rien de tel pour développer l'humilité que de lire ce genre de conversation, vu que j'y comprends strictement rien, et pourtant il y a plein de mots français... :cali: ]
Avatar de l’utilisateur
Christophe67
Barbarus
Barbarus

Re: langage de programmation

Message non lu par Christophe67 »

Fée Violine a écrit :[petit hors sujet : rien de tel pour développer l'humilité que de lire ce genre de conversation, vu que j'y comprends strictement rien, et pourtant il y a plein de mots français... :cali: ]

:-D :-D :-D


Pas de soucis Fée, c'est notre lot à tous dans bien d'autres domaines.
Mac
Tribunus plebis
Tribunus plebis
Messages : 3962
Inscription : lun. 09 févr. 2009, 23:40
Localisation : la Réunion

Re: langage de programmation

Message non lu par Mac »

Bonjour Christophe, :)
Christophe67 a écrit :Je ne suis pas certain de comprendre par : processus non Windows.
Est ce un processus sous un autre système d'exploitation (Macintosh, Linux ...), ou un processus d'un programme tiers non inclus à Windows, ou fonctionnant sous émulation ( Wyse par exemple, émulation Windows sous Linux ) ?
Il s'agit d'un programme tiers non inclus à Windows, en fait le programme que j'essayer de finaliser; c'est pourquoi avec TerminateProcess je peux arrêter "notepad.exe" mais pas le processus de mon programme.
Il me semble comprendre que vous souhaitez tuer le processus de votre propre programme.
C'est exactement ça.
En C++ je peux l'arrêter mais je n'arrive pas à mettre un délai. Mon programme s'ouvre, s'il y a une action (click) il s'exécute, s'il n'y a pas d'action il se ferme automatiquement au bout de 10 secondes.
Est-ce pour le fermer à partir d'un autre programme ?
Oui; C'est la solution la plus simple à laquelle j'avais pensé. En lançant mon programme, un VBS se lance en même temps et tue le processus du programme au bout de 10 secondes. Simple, sauf que cela ne marche pas; parce que d'après ce que j'ai compris, ce n'était pas un processus d'un programme de Windows.
Est-ce que en quittant le programme, le processus reste présent et vous souhaitez le faire disparaître ?
En quittant le programme, le processus s'arrête.
Est-ce que dans votre programme vous créez un thread qui reste actif après la fermeture du programme ?
J'ai entendu parler du thread mais je n'ai pas compris ce que c'est. De quoi s'agit-il, svp?
J'ai oublié de répondre à une question : j'entendais par Handle de la fenêtre un pointeur sur une fenêtre (à par exemple la fenêtre avec pour titre 'Sans titre - Bloc-notes' pour le processus Notepad.exe) qui permet, à partir de celui-ci, de pointer sur son processus.
Cela évite de lister tous les processus, de trouver le PID correspondant puis de le fermer.
Ah ok! C'est un pointer.
Je reconnais ne pas être toujours clair dans mes explications ayant tendance à utiliser un langage de coder :oops: , j'espère que l'exemple en réponse 1 sera plus explicite.
Ce que vous dites est très clair. Et merci pour les liens.

Fraternellement. :coeur:
Avatar de l’utilisateur
Fée Violine
Consul
Consul
Messages : 13106
Inscription : mer. 24 sept. 2008, 14:13
Conviction : Catholique ordinaire. Laïque dominicaine
Localisation : France
Contact :

Re: langage de programmation

Message non lu par Fée Violine »

Christophe67 a écrit :
Fée Violine a écrit :[petit hors sujet : rien de tel pour développer l'humilité que de lire ce genre de conversation, vu que j'y comprends strictement rien, et pourtant il y a plein de mots français... :cali: ]

:-D :-D :-D

Pas de soucis Fée, c'est notre lot à tous dans bien d'autres domaines.
Oui, chacun de nous a des moyens différents pour accéder à l'humilité et c'est une très bonne chose ! ;) Merci Seigneur ! Fin de la parenthèse].
Avatar de l’utilisateur
Christophe67
Barbarus
Barbarus

Re: langage de programmation

Message non lu par Christophe67 »

Bonjour Mac,


On va essayer de clarifier tout cela pour affiner votre demande car j'ai peur de bloquer sur le fait que vous suicidiez votre programme plutôt que de le quitter proprement et simplement.

Si je synthétise vos propos vous voulez créer un programme qui, une fois lancé :

* teste si une action est effectuée dans les 10s ( clic, clavier, souris ...);
FALSE : votre programme doit être fermé;
SUCCESS: votre programme s'exécute.

Doit-il se suicider/fermer après cette exécution, ou bien devez-vous faire une boucle qui va contrôler à nouveau une action dans les 10 secondes suivantes pour s'exécuter à nouveau ou se fermer?
En gros, votre programme resterait il actif tant qu'un événement de type OnMouseClick est effectué au moins toutes les 10s et se fermerait à un moment quelconque si le clic n'est plus effectué ?

Je vais attendre votre réponse pour ne pas trop m'éparpiller car, si c'est ce que je pense, je ne comprends pas l'intérêt de fermer le programme en tuant son processus. Je vous dirai pourquoi par la suite car un tas d'autres solutions viennent à mon esprit (timer dans une boucle principale ou dans un thread, entre autres).


Cordialement.
Mac
Tribunus plebis
Tribunus plebis
Messages : 3962
Inscription : lun. 09 févr. 2009, 23:40
Localisation : la Réunion

Re: langage de programmation

Message non lu par Mac »

Christophe67 a écrit :On va essayer de clarifier tout cela pour affiner votre demande car j'ai peur de bloquer sur le fait que vous suicidiez votre programme plutôt que de le quitter proprement et simplement.

Si je synthétise vos propos vous voulez créer un programme qui, une fois lancé :

* teste si une action est effectuée dans les 10s ( clic, clavier, souris ...);
FALSE : votre programme doit être fermé;
SUCCESS: votre programme s'exécute.
Grosso-modo c'est ça.
II s'ouvre et si je clique sur l'image (puisque c'est une image) il s'exécute. Si je ne clique pas au bout de 10 secondes, il se ferme tout seul.
Je vais attendre votre réponse pour ne pas trop m'éparpiller car, si c'est ce que je pense, je ne comprends pas l'intérêt de fermer le programme en tuant son processus.
En fait il n'y a pas vraiment d'intérêt si ce n'est que je ne sais pas le faire (c'est-à-dire fermer le programme au bout de 10 seconde) en C++ mais en VBS. J'avais essayé en C++ mais j'étais bloqué.
Je vous dirai pourquoi par la suite car un tas d'autres solutions viennent à mon esprit (timer dans une boucle principale ou dans un thread, entre autres).
Là j'ai réussi à le faire en suivant vos indications dans les messages précédents :clap: , mais je suis intéressé par les solutions que vous avez à me proposer.

Merci.

Fraternellement. :coeur:
Avatar de l’utilisateur
Christophe67
Barbarus
Barbarus

Re: langage de programmation

Message non lu par Christophe67 »

Finalement le problème est plus simple que je ne pensais, c'est la solution qui m'induisait en erreur.

Voici ce que je peux vous proposer : l'utilisation d'un timer. Malheureusement je ne sais pas comment cela se fait en général sur C++, je le peux sous Borland C++ vu que les composants sont identiques à Delphi Pascal.


* Lors de l'initialisation du programme, vous récupérez l'heure actuelle, vous sauvegardez.
* Vous mettez en place un timer qui s'exécutera tous les 1/10e de seconde (pour éviter de surcharger le proc et la durée devrait suffire pour tester un clic.), ce timer pointera sur votre routine/fonction de test.
* Vous encapsulez votre image dans un objet ( bouton, cadre, bords ...) et à partir de cet objet vous récupérerez l'évènement. Cela permet par exemple de récupérer l'évènement lorsque le clic aura lieu sur l'objet qui encapsule l'image et non au moindre clic de la souris.

Par exemple sous Borland C++ ou Delphi, j'utilise un composant Image dans lequel je déclare mon image, j'insère cet objet dans ma VCL (interface) et je fais pointer l'évènement onMouseClick sur la routine de test.

Mon Timer lui fera une comparaison tous les 1/10eme de secondes entre l'heure de référence et l'heure actuelle.
- si un évènement onMouseClick a été produit avant d'atteindre 10 secondes, le timer enverra un flag à la routine principale
- si aucun évènement clic ne s'est produit dans les 10sec il enverra un autre flag indiquant la fermeture du programme.


Je vais essayer de structurer tout cela :


1/ Routine d'initialisation (cette routine se lancera sur un évènement de type onExecute ou OnStart par exemple afin d'être exécutée avant la routine principale)
- par sécurité on met à zéro un label (une variable) qui va servir de flag ( EndProg = 0)
- on récupère l'heure actuelle et on sauve sous les labels Time1 et Time2.

2/ Routine principale correspondant par exemple à Main {}

- on teste si EndProg <> 0 (différent de zéro) alors un évènement s'est produit sinon on ne fait rien et on laisse courir le timer.
  • si EndProg = 1 alors on exécute la routine correspondante.
  • si EndProg = 2 alors on va quitter le programme en n'oubliant pas de libérer le timer
3/ Routine correspondant à l'évènement onMouseClick sur le composant image
- EndProg = 1 , on indique à la routine principale d'exécuter la routine correspondante (la 5)

4/ Routine du Timer qui va tester le délai de 10 sec
- on compare Time1 à Time2
  • Si > 10s alors EndProg = 2 (on indique qu'on quitte)
  • Si < 10sec alors on sauve l'heure actuelle dans time2 pour le prochain test
5/ La routine qui doit être exécutée lorsque le clic a eu lieu comme prévu dans les 10sec.
- Code de la routine
- EndProg = 0 , Time1 et Time2 = heure actuelle( on réinitialise afin d'attendre les prochaines 10sec.)


Voilà j'espère ne pas avoir commis d'erreur car je fais çà de tête du boulot.

En gros on va avoir un timer qui va durer tout le temps de notre programme, tous les 1/10eme il va vérifier si le temps d'inaction n'est pas dépassé.
Lorsqu'on va cliquer sur l'image la routine sera exécutée et l'intervalle des 10sec réactualisé.
Si on ne clique pas durant les 10sec on procède à la fermeture du programme.


Ainsi pas besoin de suicider son processus et de risquer une sortie pas propre avec des fuites ( mémoire, ressources, cycle processeur non restitués). Le fait de le fermer proprement va régler tout cela, et pas besoin de faire appel à un programme tiers comme vbs qui ne fera qu'alourdir le tout.


Concernant le thread, pour faire très simple disons que c'est une portion de programme qui va s'exécuter à part et de façon autonome. Utile par exemple pour une routine récurrente, comme une vérification permanente d'une base de données dans un programme de tchat, sans que vous n'ayez à vous occuper de cette action dans le cadre de votre routine principale. La routine est autonome et peut déclencher des évènements, transmettre des données à la routine principale.
Puisqu'on est dans les processus on va dire que c'est en gros un processus dans le processus ;)


Cordialement.


PS: j'ai fureté très rapidement sur google, il y a des exemples de programmation de timer en C++, d'après ce que j'ai compris du code toutes ne sont pas intéressantes, par exemple méfiez vous de celles proposant un Sleep() qui est une action bloquante.
Dernière modification par Christophe67 le mar. 19 mai 2015, 14:54, modifié 1 fois.
Avatar de l’utilisateur
Christophe67
Barbarus
Barbarus

Re: langage de programmation

Message non lu par Christophe67 »

Là j'ai réussi à le faire en suivant vos indications dans les messages precédents :clap: , mais je suis intéressé par les solutions que vous avez à me proposer.
Du coup il y a encore plus simple puisque c'est votre propre processus que vous souhaiter fermer.
Utilisez l'API Windows GetCurrentProcess, plus simple à utiliser que OpenProcess, qui lui est plus adapté pour trouver le PID d'un autre processus.
Cà vous renvoie directement le handle du processus de votre programme que vous n'avez plus qu'à utiliser avec TerminateProcess.

En delphi par exemple on peut faire çà en une seule fois : TerminateProcess(GetCurrentProcess, 0) , peut être aussi en C++.
Mac
Tribunus plebis
Tribunus plebis
Messages : 3962
Inscription : lun. 09 févr. 2009, 23:40
Localisation : la Réunion

Re: langage de programmation

Message non lu par Mac »

Bonjour Christophe67, :)
Christophe67 a écrit :....Cà vous renvoie directement le handle du processus de votre programme que vous n'avez plus qu'à utiliser avec TerminateProcess.
En delphi par exemple on peut faire çà en une seule fois : TerminateProcess(GetCurrentProcess, 0) , peut être aussi en C++.
TerminateProcess(GetCurrentProcess, 0) : le 0 correspond à quoi dans le code?
PS: j'ai fureté très rapidement sur google, il y a des exemples de programmation de timer en C++, d'après ce que j'ai compris du code toutes ne sont pas intéressantes, par exemple méfiez vous de celles proposant un Sleep() qui est une action bloquante.
Effectivement Sleep(), l'ayant appliqué, mon programme s'est mis en attente, tout se bloque. :flash:

Merci pour la définition du thread : un processus dans le processus.

Je vais essayer de suivre votre démarche que vous m'avez présentée dans le message précédent et faire les recherches pour le mettre sous forme de code.

Fraternellement. :coeur:
Avatar de l’utilisateur
Christophe67
Barbarus
Barbarus

Re: langage de programmation

Message non lu par Christophe67 »

TerminateProcess(GetCurrentProcess, 0) : le 0 correspond à quoi dans le code?
La syntaxe de l'API TerminateProcess est définie comme ceci dasn les liens proposés plus haut :

BOOL WINAPI TerminateProcess(
_In_ HANDLE hProcess,
_In_ UINT uExitCode
);

Cette API réclame donc 2 paramètres :

1 pointer (définit par Handle d'ou le nom que je lui donne par déformation) sur le processus à fermer
1 integer ( ici en rubrique remarks, si mamémoire ne me fait pas défaut 0 correspondant au processus principal).

Du coup TerminateProcess(GetCurrentProcess, 0) va être traité comme ceci :

GetCurrentProcess va récupérer le handle du processus, placer le résultat dans la syntaxe de TerminateProcess puis l'exécuter.
2 barils pour le prix d'un, pratique ! J'adore le Delphi Pascal je trouve ce langage très pratique et carrément esthétique.

Bon code Mac .
Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 2 invités