Bonsoir,
Suite la l'incorporation d'une fonction dans une classe pour la gestion d'une thread (j'avais trouvé cela
http://c.developpez.com/faq/cpp/?pag...onction_membre
en fouillant dans le forum), j'ai écrit le code suivant (c'est une version "allégée" pour comprendre):
Le .h
Puis le .c
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 #define NB_ACCESS 50 // status #define S_INIT "Init" #define S_WORKING "Working" #define S_OPENED "Opened" #define S_CLOSED "Closed" #define S_BLOCKED "Blocked" class access { public: access(void); ~access(void); // open and close for access management (not for doing an action on one access) void openAll(void); void closeAll(void); void setStatus(const unsigned int access, string Status); string AccessAray[NB_ACCESS]; void open(const unsigned int access); // thread of opening void *OpenCall(void *pvParameter); // this can not be in the class because it's a C function // http://c.developpez.com/faq/cpp/?page=fonctions#CLASS_pblm_pointeur_fonction_membre // reinterpret_cast is used for incorporate in the function static void *staticOpenCall(void *Param) { access* Obj = reinterpret_cast<access*>( Param ); return Obj->OpenCall(Param); } };
Ceci compile (avec la gestion des threads), je suis avec VC 2005 Express.
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 // UTAccess.cpp : définit le point d'entrée pour l'application console. // #include "stdafx.h" #include <pthread.h> #include <string> using namespace std; #include "Test.h" access::access(void) { } access::~access(void) { } void access::openAll(void) { unsigned int Cpt; for ( Cpt = 0 ; Cpt < NB_ACCESS ; Cpt++ ) { AccessAray[Cpt] = "Hello";//S_INIT; } } void access::closeAll(void) { } // Indicate the status of one access number "access" void access::setStatus(const unsigned int access, string Status) { if (access < NB_ACCESS) { AccessAray[0] = "Working"; // Pour debug AccessAray[access] = Status; } } // Code du thread void *access::OpenCall(void *pvParameter) { AccessAray[0] = "Gros souci"; // C'est là, entre les dents et la gencives que les bactéries attaquent setStatus(0,S_OPENED); return NULL; } // Open access number "access" void access::open(const unsigned int access) { setStatus(access, S_WORKING); // Lance le Thread pthread_t ta; pthread_create (&ta, NULL, access::staticOpenCall, NULL); return; } int _tmain(int argc, _TCHAR* argv[]) { access a; a.openAll(); a.open(0); while(1);// Juste pour éviter de sortir et faire ire travailler le thread return 0; }
Bon, le souci est dans le code du thread
// Code du thread
void *access::OpenCall(void *pvParameter)
-> AccessAray[0] = "Gros souci";
Là VC++ m'indique une violation d'accès que je ne comprends pas.
Pour voir, j'ai trout mis en public dans ma classe, rien n'y fait.
Je pense avoir le droit de remplacer le code d'une string par une autre.
C'est sans doute le code qui incorpore la gestion d'une fonction dans une classe.![]()
Merci
Partager