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

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); 
        } 
};
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
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;
}
Ceci compile (avec la gestion des threads), je suis avec VC 2005 Express.
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