Langage de programmation (fermer/suicider un processus)

Répondre


Cette question vous permet de vous prémunir contre les soumissions automatisées et intensives effectuées par des robots indésirables.
Émoticônes
:?: :!: :arrow: :nule: :coeur: :) ;) :( :mal: :D :-D :oops: :cool: :/ :oui: :> :diable: <: :s :hypocrite: :p :amoureux: :clown: :rire: :-[ :sonne: :ciao: :zut: :siffle: :saint: :roule: :incertain: :clap: :fleur: :-@ :non: :cry: :bomb: :exclamation: :dormir: :wow: :boxe: :furieux: :toast: :dance: :flash:
Plus d’émoticônes

Le BBCode est activé
La balise [img] est activée
La balise [url] est activée
Les émoticônes sont activées

Relecture du sujet
   

Agrandir Relecture du sujet : Langage de programmation (fermer/suicider un processus)

Re: Langage de programmation (fermer/suicider un processus)

par Christophe67 » ven. 22 mai 2015, 9:08

Bonjour Mac,


Je vous en prie, c'est un réel plaisir de pouvoir partager, sur un même forum, deux passions communes : Dieu puis très loin après la programmation.


N'hésitez pas si vous souhaitez des conseils supplémentaires, si je suis en mesure d'y répondre ce sera avec grand plaisir.


Fraternellement et binairement. :clown:


Christophe

Re: Langage de programmation (fermer/suicider un processus)

par Mac » jeu. 21 mai 2015, 17:00

Bonjour Christophe, :)
Christophe67 a écrit :...
PS : au cas ou vous rencontriez encore ce type d'encodage voici un lien sur les entités spéciales avec leurs correspondances.
Pas de nouvelle, bonne nouvelle!
Tout marche grâce à votre précieuse aide.
Merci bien pour tout, pour le lien sur les entités spéciales notamment qui va certainement grandement me servir.

Très Fraternellement en Jésus Christ. :coeur:

Re: Langage de programmation (fermer/suicider un processus)

par Mac » mer. 20 mai 2015, 16:11

Bonjour Christophe, :)
Christophe67 a écrit :Oui et non , en fait c'est l'encodage du texte qui fait cela : ">" est en fait ">" en UTF8. Ce qui donne :if( (ctv.tv_sec > tv.tv_sec) )
Merci je comprends mieux. :oui:

ps : un bon site que je connais si cela vous intéresse c'est : thenewboston.

Fraternellement. :coeur:

Re: Langage de programmation (fermer/suicider un processus)

par Christophe67 » mer. 20 mai 2015, 16:01

Mac a écrit :
Christophe67 a écrit :Comme je suis un grand curieux, j'ai voulu voir ce que pouvait proposer C++.
J'ai trouvé ceci, simple et que vous pouvez adapter facilement à votre besoin. ...t réutiliser par la suite.Cordialement.
Bonjour Christophe,

Il n'y aurait pas une erreur à la ligne 17, la condition me paraît bizarre avec la point virgule au beau milieu? Je ne connais pas donc je préfère avoir votre avis. Merci beaucoup.
Par contre j'ai suivi les liens qu'ils proposent et les codes sont bons et cela était très très instructif.

Fraternellement. :coeur:

Bonjour Mac,


Oui et non , en fait c'est l'encodage du texte qui fait cela : ">" est ">" en UTF8. Ce qui donne :

if( (ctv.tv_sec > tv.tv_sec) )


Cordialement.


PS : au cas ou vous rencontriez encore ce type d'encodage voici un lien sur les entités spéciales avec leurs correspondances.

Re: Langage de programmation (fermer/suicider un processus)

par Mac » mer. 20 mai 2015, 13:47

Christophe67 a écrit :Comme je suis un grand curieux, j'ai voulu voir ce que pouvait proposer C++.
J'ai trouvé ceci, simple et que vous pouvez adapter facilement à votre besoin. ...t réutiliser par la suite.Cordialement.
Bonjour Christophe,

Il n'y aurait pas une erreur à la ligne 17, la condition me paraît bizarre avec la point virgule au beau milieu? Je ne connais pas donc je préfère avoir votre avis. Merci beaucoup.
Par contre j'ai suivi les liens qu'ils proposent et les codes sont bons et cela était très très instructif.

Fraternellement. :coeur:

Re: Langage de programmation (fermer/suicider un processus)

par Christophe67 » mer. 20 mai 2015, 9:10

Bonjour Mac


Comme je suis un grand curieux, j'ai voulu voir ce que pouvait proposer C++.

J'ai trouvé ceci, simple et que vous pouvez adapter facilement à votre besoin. Il y a mieux et plus précis, mais ca me semble une bonne base de départ.
Vous pouvez par la suite les adapter en Class afin de vous faire une bibliothèque de fonctions que vous pourrez facilement réutiliser par la suite.


Cordialement.

Re: langage de programmation

par Christophe67 » mar. 19 mai 2015, 16:03

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 .

Re: langage de programmation

par Mac » mar. 19 mai 2015, 15:33

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:

Re: langage de programmation

par Christophe67 » mar. 19 mai 2015, 14:47

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++.

Re: langage de programmation

par Christophe67 » mar. 19 mai 2015, 14:16

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.

Re: langage de programmation

par Mac » mar. 19 mai 2015, 12:39

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:

Re: langage de programmation

par Christophe67 » mar. 19 mai 2015, 11:21

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.

Re: langage de programmation

par Fée Violine » mar. 19 mai 2015, 10:46

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].

Re: langage de programmation

par Mac » mar. 19 mai 2015, 10:04

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:

Re: langage de programmation

par Christophe67 » mar. 19 mai 2015, 1:12

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.

Haut