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

Comment relancer un Thread après sa création? [URGENT] - C++ - Programmation

Marsh Posté le 06-01-2006 à 10:17:18    

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
Reply

Marsh Posté le 06-01-2006 à 10:17:18   

Reply

Marsh Posté le 06-01-2006 à 10:22:59    

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 )-
Reply

Marsh Posté le 06-01-2006 à 10:30:00    

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?

Reply

Marsh Posté le 06-01-2006 à 10:42:57    

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
Reply

Marsh Posté le 06-01-2006 à 10:43:23    

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 )-
Reply

Marsh Posté le 06-01-2006 à 10:44:04    

Merci bcp blackGoddess:)

Reply

Marsh Posté le 06-01-2006 à 11:16:57    

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

Reply

Marsh Posté le 06-01-2006 à 11:57:01    

personne pour m'aider?

Reply

Marsh Posté le 06-01-2006 à 18:57:35    

Au secours..... :'(

Reply

Marsh Posté le 06-01-2006 à 19:31:54    

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)

Reply

Marsh Posté le 06-01-2006 à 19:31:54   

Reply

Marsh Posté le 06-01-2006 à 19:58:42    

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?

Reply

Marsh Posté le 06-01-2006 à 20:09:17    

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 :)

Reply

Marsh Posté le 06-01-2006 à 20:16:22    

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

Reply

Marsh Posté le 06-01-2006 à 20:52:07    

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
Reply

Marsh Posté le 08-01-2006 à 15:53:15    

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
Reply

Marsh Posté le 08-01-2006 à 16:19:08    

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
Reply

Marsh Posté le 08-01-2006 à 20:50:38    

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]

Reply

Marsh Posté le 09-01-2006 à 10:31:32    

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?

Reply

Marsh Posté le 09-01-2006 à 11:24:09    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed