Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

THREADS : PARTAGE DE VARIABLE GLOBALE, FIN DE THREADS


Information sur la source

Catégorie :API Niveau : Débutant Date de création : 18/01/2004 Vu / téléchargé: 4 821 / 2 639

Note :
5 / 10 - par 1 personne
5,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

Description

Juste un petit programme de test  qui ouvre 5 threads affichant chacun une boite de dialogue modale avec un bouton. 4 thread se partagent une variable globale de type char * à laquelle il concatene leur noms à leurs fermeture. Le dernier thread (SuperThread) permet de fermer tout les threads ouverts (un peu brutalement c vrai, mais ca fonctionne).
 

Conclusion

C'est juste un petit code pour tester les threads afin de mieux comprendre leur fonctionnement.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de ymca2003 le 19/01/2004 13:26:11

Salut, quelques petites remarques :

la ligne :
while(!terminer);

qui sert à attentre que le "super thread " soit terminé est à proscrire.
- tout d'abord, cette instruction consomme quasiment 100% du CPU pour rien.
- ensuite, cela ne marche pas en mode release a cause des optimisations.

en mode Debug, la variable est évaluée à chaque while mais en mode release, elle est évaluée une fois au début et puis c'est tout. On obtient une boucle sans fin (suffit de regarder le code assembleur généré) :

004010E8 : mov  al,BYTE PTR[terminer]
004010ED : test al,al      <---- test une seule fois au début
004010EF : jne  004010F3
004010F1 : jmp  004010F1   <---- boucle sans fin
004010F3 : ...

pour éviter la boucle sans fin, il suffit de déclarer la variable "terminer" en tant que "volatile" :
volatile bool terminer;
cette technique marchera en mode Release mais consomera toujours le CPU. code généré :
004010E8 : mov  al,BYTE PTR[terminer]
004010ED : test al,al
004010EF : jne  004010F3
004010F1 : mov  al,BYTE PTR[terminer]
004010F6 : test al,al       <---- test à chaque boucle
004010F8 : jmp  004010F1
004010EF : ...

La meilleur technique pour attendre q'un thread se termine tout seule est:
WaitForSingleObject(hThread,INFINITE) qui n'utilise pas le CPU.
Cependant, si le thread que l'on attent utilise "SendMessage" pour envoyer un message à une fenêtre du thread qui attend, il y a un risque de DeadLock  (le message ne sera pas traité car le thread censé le géré est en attente et le thread qui a envoyé le message attendra que le message soit traité). D'où tout le monde s'attend.


Ta variable CRITICAL_SECTION ne sert à rien (tu ne l'utilise pas). une utilisation possible serait à chaque fois que du manipule la variable texte:
EnterCriticalsection(&Sync);
strcat(texte,"....");
LeaveCriticalSection(&Sync);

Cela empêchera 2 threads différents de manipuler "texte" au même moment.

Cependant, on utilisant cette technique, TerminateThread est à proscrire car il risque d'interrompre le thread pendant qu'il est dans une section critique qui ne sera jamais relâchée.

Pour éviter d'utiliser TerminateThread, il suffit de poster un message aux boîtes de dialogues pour les fermer:
PostMessage(hDlg, WM_COMMAND,IDC_QUITTER,0);

puis d'attendre que les threads se terminent avec WaitForMultipleObject.


Conclusion : la synchronisation des threads n'est pas aisée, il faut savoir ce qu'il font à tout moment pour éviter des DeadLock.

pour en savoir plus sur les threads : JR4.zip
http://perso.wanadoo.fr/persans-brunews/brunews/download.htm

signaler à un administrateur
Commentaire de Oeil_de_taupe le 25/08/2006 18:04:26


Petite question pour ymca2003, penses-tu que dans le cas de la boucle "while(!terminer);" remplacer la variable "bool" par une "bool volatile" ferait marcher le programme en mode release?

Cependant je suis d'accord avec toi, il faut mettre un "Sleep" dans le boucle pour ne pas prendre 100% du CPU ou mettre un WaitForObject avec un timeout, toutes les 500 ms par exemple, afin de récupérer d'éventuels messages.

signaler à un administrateur
Commentaire de swonder le 11/09/2008 08:55:08

Bien que ma réponse est trés tardive, je suis entièrement d'accord avec le commentaire de ymca2003. J'ai fait de la façon qu'il a indiqué peu de temps aprés avoir diffusé ce source.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,218 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.