Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1489 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [URGENT] Comment relancer un Thread après sa création?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[URGENT] Comment relancer un Thread après sa création?

n°1278019
infoprice
Posté le 06-01-2006 à 10:17:18  profilanswer
 

Salut à tous, j'ai besoin de votre aide :)
je suis en train de bosser sur un thread qui devra tourner pdt toute la durée d'exécution de l'appli et s'occupera de vérifier l'heure de la machine. Le thread lancera des événements en fonction de l'heure trouvée.
Pour le moment, j'arrive à créer le thread et le lancer mais il ne se lance qu'une fois alors que je voudrais qu'il se lance en boucle et se termine seulement lorsque le client quitte l'appli.
 

Code :
  1. hThreadTimer = CreateThread(NULL,0,MyFirstThreadTimer,NULL, CREATE_SUSPENDED ,NULL); //Le thread ne se lance pas à la création
  2.     if ( NULL == hThreadTimer) //on vérifie la création du thread
  3.       MessageBox(NULL,L"Echec de la céation du thread Timer",L"Exemple 1",MB_OK);
  4.     else
  5.     {
  6.       DWORD dwWait;
  7.       dwWait = ResumeThread(hThreadTimer); // on lance le Thread
  8.       //dwWait = WaitForSingleObject(hThreadTimer,INFINITE);
  9.       //if (WAIT_OBJECT_0 == dwWait)
  10.              MessageBox(NULL,L"Le thread Timer est terminé",L"Exemple 1", MB_OK);
  11.      
  12.        //CloseHandle(hThreadTimer); //Je le fermerai plus tard...
  13.      }



Avez vous une idée, un exemple pour m'aider?  
Merci pour votre aide précieuse.


Message édité par infoprice le 06-01-2006 à 12:19:04
mood
Publicité
Posté le 06-01-2006 à 10:17:18  profilanswer
 

n°1278024
blackgodde​ss
vive le troll !
Posté le 06-01-2006 à 10:22:59  profilanswer
 

j'ai pas bien compris ton histoire ...
 

Code :
  1. HANDLE hThreadTimer = CreateThread(NULL,0,MyFirstThreadTimer,NULL, 0 ,NULL);
  2. DWORD WINAPI MyFirstThreadTimer(LPVOID osf)
  3. {
  4.     while(on doit pas quitter)
  5.     {
  6.         on regarde l'heure, on déclenche les evenements
  7.     }
  8. }



---------------
-( BlackGoddess )-
n°1278029
infoprice
Posté le 06-01-2006 à 10:30:00  profilanswer
 

blackgoddess a écrit :

j'ai pas bien compris ton histoire ...
 

Code :
  1. HANDLE hThreadTimer = CreateThread(NULL,0,MyFirstThreadTimer,NULL, 0 ,NULL);
  2. DWORD WINAPI MyFirstThreadTimer(LPVOID osf)
  3. {
  4.     while(on doit pas quitter)
  5.     {
  6.         on regarde l'heure, on déclenche les evenements
  7.     }
  8. }



 
Merci pour ta réponse super rapide :)
 
Alors pour t'expliquer brievement, je lance le thread à l'initialisation de l'application. Au au cours de l'exécution du programme principal, je désire avoir un thread qui tourne en fond de tache (sans bloquer l'appli) et qui vérifiera l'heure du système et déclenchera les évenements.
 
 
le while utiliser dans MyFirstThreadTimer() bloque l'appli ou tourne en fond de tache?

n°1278038
infoprice
Posté le 06-01-2006 à 10:42:57  profilanswer
 

blackgoddess a écrit :

j'ai pas bien compris ton histoire ...
 


 
ca marche et ca ne bloque pas l'appli, nickel :)
 

Code :
  1. DWORD WINAPI MyFirstThreadTimer(LPVOID p)
  2. {
  3. while (1) {
  4.  MessageBox(NULL,L"Je suis ds le threadTimer",L"Timer",MB_OK);
  5.  Sleep(1000);
  6. }
  7. return 0;
  8. }


Message édité par infoprice le 06-01-2006 à 10:43:26
n°1278040
blackgodde​ss
vive le troll !
Posté le 06-01-2006 à 10:43:23  profilanswer
 

bin c'est 2 threads differents ... 2 fils d'execution indépendants, c'est le concept meme d'un thread.
 
apres pour pas qu'il claque le cpu pour rien, faut utiliser une api bloquante dans le while (attente d'un evenement, sleep, ...)


---------------
-( BlackGoddess )-
n°1278041
infoprice
Posté le 06-01-2006 à 10:44:04  profilanswer
 

Merci bcp blackGoddess:)

n°1278071
infoprice
Posté le 06-01-2006 à 11:16:57  profilanswer
 

BlackGoddess, j'aurais une autre question à te poser ou aux autres si vous savez :)
Je voudrais créer un Thread et le lancer manuellement autant de fois que je le désire sans avoir à le recréer à chaque fois, est ce possible? si oui, comment faire?
 
Voici ce que j'ai fais mais ca ne marche pas, il ne le lance qu'une fois.
 

Code :
  1. hThreadTimer = CreateThread(NULL,0,MyFirstThreadTimer,NULL, CREATE_SUSPENDED,NULL);
  2. if ( NULL == hThreadTimer)
  3.          MessageBox(NULL,L"Echec de la céation du thread Timer",L"Exemple 1",MB_OK);
  4. else
  5. {
  6.        DWORD dwWait = ResumeThread(hThreadTimer);
  7.        DWORD dw = ResumeThread(hThreadTimer);
  8. }

n°1278098
infoprice
Posté le 06-01-2006 à 11:57:01  profilanswer
 

personne pour m'aider?

n°1278345
infoprice
Posté le 06-01-2006 à 18:57:35  profilanswer
 

Au secours..... :'(

n°1278356
mrbebert
Posté le 06-01-2006 à 19:31:54  profilanswer
 

Faut pas le lancer plusieurs fois. Une fois créé et démarré, il continue à tourner indéfiniment :)  
 
(bon, il y a surement moyen de le mettre en pause et de le relancer depuis le thread principal mais c'est pas indispensable)

mood
Publicité
Posté le 06-01-2006 à 19:31:54  profilanswer
 

n°1278369
infoprice
Posté le 06-01-2006 à 19:58:42  profilanswer
 

mrbebert, je t'explique j'ai 2 threads:
- un thread timer qui tourne indféfiniment
- un autre thread que je voudrais appeler quand je veux sans avoir à le recréer? ou alors il faut que je le créer à chaque fois ke j'ai besoin de ce thread?

n°1278375
mrbebert
Posté le 06-01-2006 à 20:09:17  profilanswer
 

Faut voir avec des fonctions qui permettent de mettre en pause le thread et de le redémarrer. Il fait ce qu'il a à faire et se met en pause. Le programme principal pouvant le relancer en cas de besoin :)

n°1278383
infoprice
Posté le 06-01-2006 à 20:16:22  profilanswer
 

certes, je suis d'accord avec toi mais as tu un exemple?

n°1278412
mrbebert
Posté le 06-01-2006 à 20:52:07  profilanswer
 

Quelque chose dans ce genre :

Code :
  1. while (1) {
  2.     // des choses à faire
  3.     SuspendThread(hThread); // le thread se met en pause
  4. }
  5. return 0;

Le thread fait ses traitement une fois, puis se met en pause. Il bouclera pour refaire ses traitements lorsque le thread principal le réveillera avec la fonction ResumeThread() :)


Message édité par mrbebert le 06-01-2006 à 20:54:25
n°1279144
infoprice
Posté le 08-01-2006 à 15:53:15  profilanswer
 

Le main:

Code :
  1. CIzzyTV::CIzzyTV()
  2. {
  3.     HANDLE hThreadTimer;
  4. //Le thread ne se lance pas à la création
  5. hThreadTimer = CreateThread(NULL,0,MyFirstThreadTimer,NULL, CREATE_SUSPENDED,NULL);
  6. //On stock le HANDLE dans le singleton
  7. CIzzyTVHelper *a;
  8. a = CIzzyTVHelper::GetInstance();
  9. a->setThreadHandle(hThreadTimer);
  10. if ( hThreadTimer == NULL )
  11.          MessageBox(NULL,L"Echec de la céation du thread Timer",L"Exemple 1",MB_OK);
  12.     else
  13.    DWORD dwWait = ResumeThread(hThreadTimer);
  14. MessageBox(NULL,L"Test",L"Test", MB_OK);
  15. }


 
Le thread:

Code :
  1. DWORD WINAPI MyTimer(LPVOID p)
  2. {
  3. CIzzyTVHelper *a;
  4. a = CIzzyTVHelper::GetInstance();
  5. HANDLE timerHandle = a->getThreadHandle();
  6. while (1) {
  7.  MessageBox(NULL,L"Je suis ds le threadTimer",L"Timer",MB_OK);
  8.  SuspendThread(timerHandle);
  9.  //Sleep(1000);
  10. }
  11. return 0;
  12. }


 
Voici ce que j'ai fais, j'ai stocké le HANDLE précédemment crée dans un singleton, je le récupère et suspend le thread comme me la suggéré mrbebert. Le seul problème c'est qu'il bloque toute l'appli... Après SuspendThread, il n'y a plus rien... Donc je ne pense pas que ca soit la bonne méthode ou alors je l'utilise mal???

Message cité 1 fois
Message édité par infoprice le 08-01-2006 à 16:28:27
n°1279156
infoprice
Posté le 08-01-2006 à 16:19:08  profilanswer
 

Pour résumé mon besoin, je souhaite:
- créer un thread: threadTimer.
- lancer et suspendre l'activité de ce thread où je veux dans l'appli sans bloquer l'appli :)
 
Quelle est la méthode à utiliser, sachant que je lancerai ce thread au minimum 5 fois?
Resume et Suspend ou plutôt créer le thread quand j'en ai besoin puis le refermer.
 
Si vous avez des exemples de code je suis preneur.  :jap:


Message édité par infoprice le 08-01-2006 à 16:50:14
n°1279246
mrbebert
Posté le 08-01-2006 à 20:50:38  profilanswer
 

infoprice a écrit :

...
Voici ce que j'ai fais, j'ai stocké le HANDLE précédemment crée dans un singleton, je le récupère et suspend le thread comme me la suggéré mrbebert. Le seul problème c'est qu'il bloque toute l'appli... Après SuspendThread, il n'y a plus rien... Donc je ne pense pas que ca soit la bonne méthode ou alors je l'utilise mal???

Le thread est en pause. Donc il ne fait rien tant que quelqu'un d'autre ne l'a pas réveillé. Or, le programme principal ne fait rien après avoir créé ce thread. Donc, effectivement, il ne se passe plus rien, l'appli semble bloqué.
 
Il faut que ce soit le programme principal qui, de temps en temps, réveille le thread [:proy]

n°1279458
infoprice
Posté le 09-01-2006 à 10:31:32  profilanswer
 

mrbebert a écrit :

Le thread est en pause. Donc il ne fait rien tant que quelqu'un d'autre ne l'a pas réveillé. Or, le programme principal ne fait rien après avoir créé ce thread. Donc, effectivement, il ne se passe plus rien, l'appli semble bloqué.
 
Il faut que ce soit le programme principal qui, de temps en temps, réveille le thread [:proy]


 
 
DWORD dwWait = ResumeThread(hThreadTimer); qui est dans le main ne réveille pas le thread?

n°1279476
mrbebert
Posté le 09-01-2006 à 11:24:09  profilanswer
 

Si. Il le réveille une fois, le thread fait un passage dans la boucle se met en pause. Mais le programme principal ne revient jamais pour réveiller de nouveau le thread [:proy]  
Il faut faire en sorte que le programme principal vienne régulièrement re-réveiller le thread qui se remet toujours en pause.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [URGENT] Comment relancer un Thread après sa création?

 

Sujets relatifs
Cmt Programmer Une caisse enregisteuse ? URGENT[URGENT] ACCESS-------> EXCEL ????????
[XML-XSL] [Access] Création d'un album photoCréation de site Web
Création d'un gros site !Librairie GD, création de vignettes
Création de tableaux complexes en LaTeX...sur plusieurs pages!Thread Perl (Urgentissime--Help)
Inserer une heure - Définir le format de colonne à la création de tablCreation arbre avec liste
Plus de sujets relatifs à : [URGENT] Comment relancer un Thread après sa création?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR