Utilisation des threads

Signaler
Messages postés
28
Date d'inscription
samedi 21 juin 2003
Statut
Membre
Dernière intervention
23 mai 2004
-
Messages postés
41
Date d'inscription
mardi 13 janvier 2004
Statut
Membre
Dernière intervention
5 avril 2006
-
j'essaie d'apprendre à utiliser les threads mais malgres toutes les sources que je trouve sur le net j'ai toujours du mal à comprendre leur fonctionnement.

A la base ce que je voulais c faire un programme qui fait deux choses a la fois ; par exemple une fonction qui fait un test et qui tourne en boucle, et a cote que le programme puisse continuer a s'executer meme pendant l'execution de la boucle.

voici mon code :

#include <stdio.h>
#include 
#include <windows.h>

void TonThread();

void main()
{
        HANDLE hThread = 0;

        hThread=CreateThread( NULL, 0, Sample_TonThread, NULL, 0, &dThreadId);

        if (hThread != 1 )
        {
                WaitForSingleObject(hThread);
                CloseHandle(hThread);
        }
        int f;
        if (f == 5)
                printf("\nf = 5");
        scanf("%d",&f);
}

void TonThread(int f)
{
        for (f = 0 ; f < 10 ; f++)
        {
                printf("\nf : ");
                scanf("%d",&f);
        }
}


je voulais isoler la boucle pour que, lorsqu'elle est utiliser le programme puisse continuer le traitement.

ce code ne marche pas, il est rempli d'erreur mais j'ai trouve plein de code sur internet et comme aucun ne dit la meme chose je ne sais plus a quoi me fier.

pouvez vous me dire comment gerer plusieurs threads et comment les appeler a differents moments.
Je n'ai pas tres bien compris comment on les initialise car j'ai trouve plusieurs façon de le faire.

HANDLE hThread = 0;

        hThread=CreateThread( NULL, 0, Sample_TonThread, NULL, 0, &dThreadId);


Sur plusieurs documents j'ai entendu parler du "handle du thread" , mais en fait je ne sais pas ce qu'est le handle et aussi a quoi sert la premiere ligne.

je n'ai pas vu egalement dans les sources que j'ai trouve comment on faisait pour appeler les threads et comment on les lançaient, ou je n'ai pas compris le code.

si vous pouviez m'expliquer ces differents points ce serai super sympa.

8 réponses

Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
le handle du thread sert a l'identifier.
si tu fais WaitForSingleObject(hThread,INFINITE);
(dans le corps du programme ou t'as lancé le thread avec createthread), tu attends ke ce thread soit fini pour passer a la suite (la fonction bloque).
si tu t'en fous d'attendre le thread que tu lances voila comment faire :

#include <windows.h>
#include <stdio.h>

DWORD WINAPI TonThread(LPVOID param);

void main()
{
   DWORD dThreadId; // sert d'endroit ou createthread va stocker une valeur

   // On creer le thread qui va lancer la fonctio TonThread
   CreateThread( NULL, 0, TonThread,  (LPVOID)57, 0, &dThreadId);
   // Le 4e parametre est censé etre un pointeur vers
   // le parametre de la fonction TonThread.

   int g;
   for (g = 0; g < 10; g++)
   {
      Sleep(5100); // on attend 5.1 secondes.
      printf("g vaut : %d\n",g);
   }
   system("pause");
}

// Une fonction thread doit forcement etre de ce type 
// Retourner un DWORD WINAPI
// et avoir un parametre de type LPVOID (pointeur sur n'importe quoi)
DWORD WINAPI TonThread(LPVOID param)
{
   int f = (int) param;
   printf("le parametre de TonThread est : %d \n",f);
   for (f = 0 ; f < 10 ; f++)
   {
      printf("f vaut : %d\n",f);
      Sleep(5000); // on attend 5 secondes.
   }
   // Le thread est obligé de retourner quelque chose
   // (un DWORD (cad un entier de 32 bits))
   return 0;
}


et voila !
bon si t'as pas compris, explique ce que t'as pas pigé
a+ ;)
Messages postés
62
Date d'inscription
jeudi 5 juin 2003
Statut
Membre
Dernière intervention
14 octobre 2005

autre solution :

si tu prefere la simplicité des threads UNIX ,( les pthreads ), tu peux les utilisers : des programmeur on cree une librairie qui permet des crée des pthread exactement comme sur les sytemes unix...
sa se trouve un peu partout sur le net, mais je crois que officielement sa vient de chez redhat

rdv donc sur le site de la redhat linux .....

bonne prog '

++

neoh_p [=- coding spirit -=]
------- since 1999 ------
Messages postés
28
Date d'inscription
samedi 21 juin 2003
Statut
Membre
Dernière intervention
23 mai 2004

merci pour vos reponses.
j'ai un peu mieux compris le fonctionnement mais il reste encore quelques flous.

si j'ai bien compris la ligne :

CreateThread( NULL, 0, TonThread, (LPVOID)57, 0, &dThreadId);


sert a appeller le morceau de programe plus bas :

DWORD WINAPI TonThread(LPVOID param)
{
int f = (int) param;
printf("le parametre de TonThread est : %d \n",f);
for (f = 0 ; f < 10 ; f++)
{
printf("f vaut : %d\n",f);
Sleep(5000); // on attend 5 secondes.
}
// Le thread est obligé de retourner quelque chose
// (un DWORD (cad un entier de 32 bits))
return 0;
}



donc en fait ce code s'execute en premiers dans ce programme?

je ne me rappelle plus a quoi correspond le dernier parametre de CreateThread, j'avais trouve un site qui explique bien mais mon disque dur est mort et j'ai tout perdu et je ne le retrouve pas, est ce que vous pouvez m'eclairer ?

j'ai esseyer de compiler cette source sous visual studio 6.0 mais il me met une erreur :

c:\logiciel\microsoft visual studio\myprojects\threads\stdafx.cpp(42) : error C2857: '#include' statement specified with the /Ycstdafx.h command-line option was not found in the source file


je n'arrive pas à la corriger est ce que vous pouvez m'aider ?
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
'donc en fait ce code s'execute en premiers dans ce programme'
ben le premier truc qui est exécuté dans ton programme, c'est le code de la fonction main. au moment dans le main où on va rencontrer CreateThread, Windows va lancer en parallele l'execution de la fonction TonThread, mais le code du main continue aussi à s'exécuter.
le dernier parametre de CreateThread correspond a un endroit ou l'identifiant du thread va etre stocké (pointeur vers un DWORD).

pour ce qui est de ton erreur, je te conseille de recreer un projet de type 'an empty win32 application' et la t'ajoutes manuellement les fichiers dont t'as besoin (yora pu le stdafx.h).

a++
Messages postés
28
Date d'inscription
samedi 21 juin 2003
Statut
Membre
Dernière intervention
23 mai 2004

merci pour ta reponse .

si je veux faire plusieurs threads (comme par exemple un chat multiclient) est ce que je peux utiliser un seul est meme threads et l'appeller plusieurs fois dans mon programme et si oui est ce qu'il faut modifier le pointeur : (LPVOID)57 ou utiliser une autre methode ?
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
si tu veux lancer par exemple 2 threads mais que la fonction qui va etre executé par les 2 threads est la meme, et elle s'apelle fonctiontest :

DWORD dThreadId;
CreateThread( NULL, 0, fonctiontest, (LPVOID)57, 0, &dThreadId);
CreateThread( NULL, 0, fonctiontest, (LPVOID)57, 0, &dThreadId);

ta fonction fonctiontest doit etre du type :
DWORD WINAPI fonctiontest(LPVOID lpparemeter)
{

//nimporte koi

return 0;
}

le LPVOID 57 dans createThread était un exemple : cela correspond au parametre qui va etre passé a la fonction fonctiontest dans le thread qui va etre crée.

si ta fonction est :
DWORD WINAPI fonctiontest(LPVOID lpparemeter)
{
printf("le parametre vaut : %d\n",lpparameter);
//nimporte koi

return 0;
}

tu va voir :
le parametre vaut 57
le parametre vaut 57

(2 fois car tu as lancé cette fonction dans 2 threads, et a chak fois tu as passé 57 comme parametre a la fonction tontest)

dans ce que tu as dit, tu as confondu le thread et la fonction qui est appelé des que le thread commence : les threads sont différents (cad ils s'executent en parallele) mais ils executent tous les 2 ici la meme fonction (fonctiontest)

donc si tu veu faire un chat multiclient, il te suffit de lancer plusieurs thread (donc plusieurs appels a CreateThread) qui vont chacun executer la fonction de client.

voila je sais pas si j'ai été clair, mais bon...
a+ ;)
Messages postés
124
Date d'inscription
jeudi 2 janvier 2003
Statut
Membre
Dernière intervention
16 février 2006
2
Thx a tous pour ce post
il explique tres bien le fonctionnement des Thread :p
moi ca va bien me servir en tout cas
++
Messages postés
41
Date d'inscription
mardi 13 janvier 2004
Statut
Membre
Dernière intervention
5 avril 2006

1 seul mot pour tout ces posts :



MERKI !!!!!!!!!!!!!!!!!!!!!!!!!

Cow-B
-----------------------------------------------
C'est au pied du mur.... qu'on voit le mieux le mur
-----------------------------------------------