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:
Je ne m'y connais pas assez pour comprendre ce qui fait planter.
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; }
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:
Merci d'avance de votre aide
Code : Sélectionner tout - Visualiser dans une fenêtre à part run = *(BOOL*)lpParameter;
P.S: je pars dans 5 minutes, et ne pourrai surement pas lire vos réponses avant demain matin.
Partager