thread MFC, communication

thread MFC, communication - C++ - Programmation

Marsh Posté le 17-05-2005 à 12:06:57    

Bonjour,
Je travaille sous visual et j'aimerai savoir :  
Est ce qu'une la fonction qui est appelé par un thread avec "AfxBeginThread(fonction, fenetre)" peut récuperer l'ID du thread qui l'execute?

Reply

Marsh Posté le 17-05-2005 à 12:06:57   

Reply

Marsh Posté le 17-05-2005 à 14:46:07    

je c'est pas si tu as regardé la msdn...si oui en ouvrant les yeux ca devrait  aller beaucoup mieux alors!!
genre regarder le retour AfxBeginThread!!
 
...maintenant faut voir aussi ce que tu entends par ID?


Message édité par Rits75 le 17-05-2005 à 14:48:01
Reply

Marsh Posté le 18-05-2005 à 14:30:10    

j'ai reglé ce problème... mais j'en ai un autre! depuis que je lance plusieurs threads, je n'ai plus d'actualisation d'affichage!
tout d'abord, je commence par lancer les threads :  

Code :
  1. //Lancement des threads
  2. for(int i=0; i<nb_thread; i++)
  3. {
  4. if(nb_image > 0 )
  5. {
  6.  ThreadParam thread_param;
  7.  //On met à jour l'image à traiter
  8.  imageFile = FindFile::combinePath(find.filelist[0].path, string(sortNamesCSTRING[i]));
  9.  _avnct_bas->SetWindowText(imageFile.c_str());
  10.  thread_param._has_finish = false;
  11.  thread_param._image_file = imageFile;
  12.  thread_param._sensibilite = sensibilite;
  13.  _data.push_back(thread_param);
  14.  _threads.push_back(AfxBeginThread(processOneImage, this));
  15.  _corres.push_back(_threads[i]->m_nThreadID);
  16.  nb_image--;
  17. }
  18. }


et
voila la partie qui pose problème je pense :  

Code :
  1. while(nb_image>0)
  2. {
  3. for (int i=0; i<nb_thread; i++)
  4. {
  5.  //Si le thread a terminé de traiter son image
  6.  if(_data[i]._has_finish)
  7.  {
  8.   //On décremente le nombre d'images restantes
  9.   p_staying_files--;
  10.   sprintf(staying_files,"%d",p_nb_total_of_files - p_staying_files);
  11.   _processed_img.SetWindowText(staying_files);
  12.   _progress_bar_gnl->SetPos( (p_nb_total_of_files - p_staying_files) * 100 / p_nb_total_of_files );
  13.   _progress_bar->SetPos( (p_nb_total_of_files - nb_image +1) * 100 / nb_image );
  14.   //On enregistre le resultat dans le rapport
  15.   _data[i]._bad_image._folders = dossier_source;
  16.   _report._vreport.push_back(_data[i]._bad_image);
  17.   _report.saveLigne();
  18.   //On met à jour l'image à traiter
  19.   imageFile = FindFile::combinePath(find.filelist[0].path, string(sortNamesCSTRING[p_nb_total_of_files - nb_image]));
  20.   _data[i]._image_file = imageFile;
  21.   _data[i]._sensibilite = sensibilite;
  22.   //On reveille le thread
  23.   ResumeThread(_threads[i]->m_hThread);
  24.   nb_image--;
  25.   _data[i]._has_finish = false;
  26.  }
  27. }
  28. }

Reply

Marsh Posté le 20-05-2005 à 08:58:22    

peut etre parce que ton thread consomme entierement les ressources cpu.
met un sleep(1) dans ton thread pour voir si ca vient de la, si c'est le ca essai d'ameliorer en gerant la priorité.

Reply

Marsh Posté le 20-05-2005 à 10:02:58    

Code :
  1. //Si le thread a terminé de traiter son image  
  2.         if(_data[i]._has_finish)


attente active, c'est mal. Regarde du côté des event et de WaitForMultipleObjects. Ou mieux dans ton cas, génère un message perso depuis tes threads que tu vas intercepter comme un message normal depuis ton code MFC afin de mettre à jour l'interface.
Ta boucle est dans ton thread principal je suppose, c'est elle qui bloque ton code d'interface. Il faut quitter la fonction où tu te trouve pour rendre la main aux MFC afin qu'elles gèrent l'interface.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 20-05-2005 à 14:11:47    

merci pour vos réponses, mais depuis que j'utilise "WaitForMultipleObjects", le programme se bloque au second passage dans la boucle (j'utilise bien le setEvent et ResetEvent). Le plus "rigolo" c'est que quand je met des points d'arrêt en mode debug, ça fonctionne... quand je les enleve ça ne marche plus : le prog se bloque!

Reply

Marsh Posté le 20-05-2005 à 15:31:26    

Ben oui il faut rendre la main aux MFC de temps en temps pour qu'elles gèrent les messages. C'est pour ça que je te disais d'utiliser des messages. Sinon ben tu peux utiliser MsgWaitForMultipleObjects pour détecter que y'a des messages à traiter.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 20-05-2005 à 15:55:26    

ce qui bloquait c'était le "WaitForSingleObject(_threads[i]->m_hThread, 100);" : le problème c'est que mon prog principal doit attendre la fin des thread, mais doit aussi réagir aux messages que les threads lui envoient! et même si un thread envoie un message par PostMessage, alors le prog principal se bloque et attend : il ne rentre pas dans la fonction associé au message! comment faire?

Reply

Marsh Posté le 20-05-2005 à 21:37:34    

Relis mon dernier post...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 23-05-2005 à 10:05:50    

il faut utiliser "MsgWaitForMultipleObjects" à la place de "WaitForMultipleObjects" ?

Reply

Sujets relatifs:

Leave a Replay

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