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.