Passage de paramètres à des threads.

Passage de paramètres à des threads.

Voir version :

Pas de dépendances

Télécharger :

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

typedef struct 
{
    int compteur;
} threaddata;

unsigned long WINAPI Fonction1(void* params)
{
    threaddata* sub = (threaddata*)params;  // recuperation.
    while(1)
    {
        sub->compteur++;
        printf("%d\t",sub->compteur);
        Sleep(1000);
    }
}

int main()
{
    threaddata d;
    HANDLE H1;
    d.compteur = 0;
    H1 = CreateThread(NULL,0,Fonction1,(void*)&d,0,0);
    getchar();
    TerminateThread(H1,0);
    printf("Dernier parametre du thread : %d\n",d.compteur);
    return 0;
}




Commentaires

	Voici un petit exemple pour passer des paramètres à des threads.

	Dans l'exemple précédent, nous lancions le thread indépendamment. Le paramètre void* params n'était pas utilisé dans la fonction du thread.
	Ainsi, si on voulait communiquer avec le thread, il fallait donc passer par une variable globale, ce qui n'est pas très propre.

	Dans cet exemple, nous allons envoyer un paramètre au thread, sous forme de pointeur. 
	Ainsi, le thread pourra modifier des données, et le main les relire. 
	(Rien n'empêcherait non plus les deux de lire et modifier, mais il pourra y avoir des précautions à prendre que nous verrons plus tard).

	Mais dans ce cas, tout va bien aller :

	Soit une structure threaddata qui contient juste un compteur.
	Ce sera le paramètre que je partagerai avec le thread. Notez que je pourrais mettre tout ce que je veux dans le thread.

	Dans le main, je crée une instance de cette structure, que j'appelle d. Je fixe le compteur à 0.

	Puis je vais passer l'adresse de cette structure à la fonction CreateThread, en la castant en void* comme on voit.

	Dans la fonction Fonction1, l'argument params contient cette adresse que j'ai casté.
	Je n'ai qu'à recaster en pointeur de structure avec la ligne :

	threaddata* sub = (threaddata*)params;  // recuperation.

	Et puis je peux modifier l'instance de la structure, comme si j'avais passé directement le pointeur de la structure.

	Si vous lancez le programme, le thread va incrémenter la variable toutes les secondes, en l'affichant, et le main va attendre l'appui
	d'une touche.

	Quand vous appuyez, le thread se termine, mais la structure étant à jour, on affiche le compteur correctement.