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.
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.
[list] si EndProg = 1 alors on exécute la routine correspondante.[/list]
[list] si EndProg = 2 alors on va quitter le programme en n'oubliant pas de libérer le timer[/list]
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
[list]Si > 10s alors EndProg = 2 (on indique qu'on quitte)[/list]
[list]Si < 10sec alors on sauve l'heure actuelle dans time2 pour le prochain test[/list]
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.