Bonjour,
tout est dis dans la question!! j'ai trouvé ce cour theoriquesur le net. mais c'est pas detaillé!! j'ai pas su comment l'appliquer en mfc!
Bonjour,
tout est dis dans la question!! j'ai trouvé ce cour theoriquesur le net. mais c'est pas detaillé!! j'ai pas su comment l'appliquer en mfc!
voila ce que j'ai fait (apres de longue recherche sur le net!!)
dans maclasse.h:
dans maclasse.cpp:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #include <afxmt.h> static CCriticalSection sc;
apparament ça marche bien!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 CCriticalSection maclasse::sc; sc.Lock(); // section critique: les instructions faites par un seul thread a la fois sc.Unlock();
j'aimerai bien que quelqu'un me corrige si j'ai tort!
C'est tout bon, mais tu pourrais encore aller plus loin avec un objet lock
ton code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 class CMyLock { public: inline CMyLock(CCriticalSection & CS) { m_cs = CS; m_cs.Lock(); } inline ~CMyLock(void) { m_cs.Unlock(); } private: CCriticalSection & m_cs; }
Code non testé, c'est juste l'idée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 static CCriticalSection sc; { CMyLock lock(sc); // lock la section critique et le destructeur se charge de delocker la section critique }
je vois pas trop comment le faire!!
en plus j'ai un petit soucie, lorsque je met 2 section critique l'une a la suite de l'autre;
j'obtient le meme message d'erreur que j'obtenait avant de mettre la section critique!! la seule diff c'est qu'il met plus de temps pour m'envoyer le message!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 sc1.Lock(); //sc1 sc1.Unlock(); sc2.Lock(); //sc2 sc2.Unlock();
comment pouvez vous expliquez ça?
Debug assertion failed !
Program: monProgram.exe
File: dbgheap.c
Line: 1044
Expression: _ctlIsValidHeapPointer(pUserData)
nb: a l'interieur de ma section critique je fais des requetes MYSQL!! (je pense pas que c'est la cause mais sait on jamais!!)
mauvaise gestion des connections/déconnections à mon avis
Je ne pense pas que le problème soit lié aux sections critiques.
Tu as un bout de code qui va probablement "jardiner" là où il n'a pas le droit. Il va falloir debugger et chercher ton problème. Malloc trop petit, ecriture en ehors d'un bloc alloué, ...
j'ai pas su comment localiser ou est mon probleme!!
si g un seul thread --> aucun probleme
plusieur thread avec:
--> aucun probleme
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 sc.lock() //inst1 //inst2 sc.Unlock();
plusieur thread avec:
--> Debug assertion failed!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 sc1.lock() //inst1 sc1.Unlock(); sc2.Lock() //inst2 sc2.Unlock();
ça semble être passé inaperçu donc je répète :
en effet :mauvaise gestion des connections/déconnections à mon avis
1 thread = 1 connec + 1 déco
2 threads = 1 connec + 1 déco + 1 connec + 1 déco
Commence par vérifier où est l'assertion, mais à mon avis c'est lié à la 2ème connexion.
je fais plusieur fois dans le code et dans differente methodes des requete mysql!!
dois je mettre chaque requete dans une section critique? ou ça n'a rien avoir?
je vois pas trop comment gérér ces connection et deconnections autrement!!
Je ne te parles pas de tes requêtes mais de la création et de la destruction de ton objet de connexion. Le plus simple est à mon avis (si c'est possible) de le mutualiser afin qu'il soit créé une seule fois avant les sections critiques et détruit après.
je sais pas si je t'ai bien compris, mais je pense que tu veux dire qu'il faut d'abord etablire la connection puis apres creer les thread!!
main en fait j'ai besoin que chaque thread etabli sa propre connexion sur une base de donnée differente!!
je sais pas si tu vois ce que je veux dire?
ok d'où mon "si c'est possible"main en fait j'ai besoin que chaque thread etabli sa propre connexion sur une base de donnée differente!!
peux-tu montrer ton code ?
voila a quoi ressemble le code:
classe1: je creer N instance de classe2
classe2:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 classe2** ensembleThread= new classe2*[]; for (i=1; i<=n; i++) { m_ptab= new classe2(); ensembleThread[i]=m_ptab; }
nb: j'obtient le bogue sans appuyer sur le bouton de deconnection
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76 void classe2:: methode1() // on_click pour connecter { // inst pour prendre qlq valeur de l'ihm methode2(); } void classe2::methode2() { methode3(); methode4(); methode5();// creation de thread pour chaque instance } void classe2::methode3() { MyData = mysql_init(NULL); mysql_real_connect(); } void classe2::methode4() { res=mysql_list_dbs(MyData, NULL); mysql_free_result(res); } void classe2::methode5() { DWORD ThreadId; m_hThread = CreateThread( NULL, 0, classe2::MyThread, (LPVOID)this, 0, &ThreadId); } DWORD WINAPI classe2::MyThread( LPVOID lParam ) { //..... section_critique1.Lock(); mysql_real_query(...); section_critique1.Unlock(); //.... section_critique2.Lock(); mysql_select_db(..); section_critique2.Unlock(); //.... section_critique3.Lock(); mysql_real_query(..); section_critique3.Unlock(); //..... while(condition) { section_critique4.Lock(); mysql_real_query(..); section_critique4.Unlock(); } } void classe2::methode6() // on_click pour se deconnecter { section_critique5.Lock(); mysql_close(MyData); MyData = NULL; section_critique5.Unlock(); }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager