IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

CreateThread ExitThread


Sujet :

C

  1. #1
    Membre actif Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Points : 203
    Points
    203
    Par défaut CreateThread ExitThread
    Bonjour.
    Je ne suis pas encore très a l'aise avec les thread. (seulement en théorie, mais jamais vraiment codé moi-même).
    Avant de me lancer, j'ai voulu faire un petit programme d'essai, pour comprendre le fonctionnement.

    Ce que j'essaie de faire (et ça marche pas si mal d'ailleur):

    1) lancer en parallèle 2 threads:
    le thread 1 affiche des '1' de façon cyclique
    le thread 2 affiche des '2' de façon cyclique

    2) Au bout de 3 secondes, je "desactive" le thread 1 (en modifiant la valeur du paramètre passé au thread), mais pas le 2.
    3) Au bout de 3 secondes de plus, je quitte le programme.

    Mais j'utilise les fonction CreateThread et je voudrai du coup utiliser ExitThread.

    Seulement le programme plante si j'utilise ExitThread (access violation)

    de plus, j'ai une question qui est surement liée à cette erreur:
    Si je crée un thread X avec une "thread function" Y. Si la fonction Y se termine (return), est-ce qu'il faut EN PLUS détruire le thread? ou est-ce que c'est fait automatiquement?

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    #include <stdio.h>
    #include <windows.h>
     
    #define TRUE 1
    #define FALSE 0
    typedef int BOOL;
     
     
    DWORD WINAPI Thread1Function( LPVOID lpParameter )
    {
    	BOOL run = *(BOOL*)lpParameter;
    	while(run)
    	{
    		printf("   1\n");
    		run = *(BOOL*)lpParameter;
    		Sleep(200);
    	}
    	return 0;
    }
     
    DWORD WINAPI Thread2Function( LPVOID lpParameter )
    {
    	BOOL run = *(BOOL*)lpParameter;
    	while(run)
    	{
    		printf("     2\n");
    		run = *(BOOL*)lpParameter;
    		Sleep(200);
    	}
    	return 0;
    }
     
    int main(void)
    {
    	BOOL thread1Active=TRUE;
    	BOOL thread2Active=TRUE;
    	HANDLE	thread1;
    	HANDLE	thread2;
    	DWORD	thread1ID;
    	DWORD	thread2ID;
     
    	thread1 = CreateThread( NULL, 0, Thread1Function, &thread1Active, 0, &thread1ID);
    	thread2 = CreateThread( NULL, 0, Thread2Function, &thread2Active, 0, &thread2ID);
     
    	Sleep(3000);
     
    	// deactivate thread 1:
    	thread1Active=FALSE;
    	printf("thread 1 deactivated\n"); //le thread 1 va dorénavent sortir de sa boucle "while(run)"
     
    	Sleep(3000);
     
    	//ExitThread(thread1ID);  <-- si je decomment cette ligne, le programma plante
    	//ExitThread(thread2ID);  <-- cell-ci aussi
     
    	return 0;
    }
    Je ne m'y connais pas assez pour comprendre ce qui fait planter.
    quand ça plante, le "access violation" a lieu dans la fonction du thread2, meme si c'est le "exitThread 1" que j'ai décommenté? Précisément, à la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    run = *(BOOL*)lpParameter;
    Merci d'avance de votre aide
    P.S: je pars dans 5 minutes, et ne pourrai surement pas lire vos réponses avant demain matin.

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    De ce que j'ai pu trouver en 2 minutes chrono :

    Voilà ce que j'ai trouvé sur ExitThread :
    ExitThread( ) can only be used to terminate the thread that calls ExitThread( ).
    Et le paramètre est le code de sortie du thread et pas le thread que tu veux tuer.

    Il faudrait utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BOOL TerminateThread(HANDLE thread, DWORD status);
    thread : donne le id du thread à tuer
    status: donne le code de terminaison à ce thread...

    Jc

  3. #3
    Membre actif Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Points : 203
    Points
    203
    Par défaut
    Hello!

    Merci pour cette réponse.

    Je me suis penché sur le TerminateThread plutot que le ExitThread, et en effet ça me semble mieux.

    Il faut d'abord s'assurer avec GetExitCodeThread que le thread a bien fini de tourner avant de le "terminate". ça a l'air plus propre, et surtout ça plante plus.

    Merci.

    (je ne clique pas tout de suite sur "résolu" au cas ou qqun a encore vite fait un ptit conseil a me donner, de derrière les fagots)

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/09/2006, 12h27
  2. Réponses: 3
    Dernier message: 25/07/2006, 10h25
  3. CreateThread sur une fonction membre (méthode)
    Par Kypper_667 dans le forum C++
    Réponses: 5
    Dernier message: 26/06/2006, 10h19
  4. Closehandle & CreateThread
    Par sebastakis dans le forum MFC
    Réponses: 4
    Dernier message: 10/05/2005, 12h22
  5. Réponses: 5
    Dernier message: 24/01/2004, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo