Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Cast de méthode vers fonction

1 réponse
Avatar
Vivien Parlat
Bonjour,

Ma question porte sur un fragment de programme pr windows mais
concerne, je pense, le C et le C++.
J'ai une classe genre:
class maclasse {
void fonc_thread(void* parm);
void meth(void) {
...
_beginthread(X, 0, NULL);
}
}
_beginthread est une fonction win32, et X doit =EAtre une fonction de
profil:
void X(void*);
Seulement quand j'appelle _beginthread(fonc_thread,...) mon compilo
(VC6) m'indique:
error C2664: '_beginthread' : cannot convert parameter 1 from 'void
(void *)' to 'void (__cdecl *)(void *)'

Quand je tente de remplacer fonc_thread par reinterpret_cast<void
(__cdecl *)(void *)>(fonc_thread), j'obtiens le message:
error C2440: 'reinterpret_cast' : cannot convert from '' to 'void
(__cdecl *)(void *)', encore moins compr=E9hensible.
Quelqu'un pourrait il m'expliquer comment utiliser fonc_thread comme
premier param=E8tre de _beginthread ? Hormis en en faisant une fonction
globale, j'aimerais autant que possible garder un comportement objet.

Merci d'avance.

1 réponse

Avatar
Serge Paccalin
Le jeudi 11 août 2005 à 23:47:06, Vivien Parlat a écrit dans
fr.comp.lang.c++ :

Bonjour,

Ma question porte sur un fragment de programme pr windows mais
concerne, je pense, le C et le C++.
J'ai une classe genre:
class maclasse {
void fonc_thread(void* parm);
void meth(void) {
...
_beginthread(X, 0, NULL);
}
}
_beginthread est une fonction win32, et X doit être une fonction de
profil:
void X(void*);
Seulement quand j'appelle _beginthread(fonc_thread,...) mon compilo
(VC6) m'indique:
error C2664: '_beginthread' : cannot convert parameter 1 from 'void
(void *)' to 'void (__cdecl *)(void *)'

Quand je tente de remplacer fonc_thread par reinterpret_cast<void
(__cdecl *)(void *)>(fonc_thread), j'obtiens le message:
error C2440: 'reinterpret_cast' : cannot convert from '' to 'void
(__cdecl *)(void *)', encore moins compréhensible.
Quelqu'un pourrait il m'expliquer comment utiliser fonc_thread comme
premier paramètre de _beginthread ? Hormis en en faisant une fonction
globale, j'aimerais autant que possible garder un comportement objet.


Tu ne peux pas l'appeler directement, parce qu'elle attend un pointeur
this et qu'elle ne l'aura pas. Mais il y a moyen de s'en sortir.

Dans l'appel à _beginthread(), tu passes comme paramètre utilisateur le
pointeur vers ton objet (au lieu du NULL ci-dessus, si je ne m'abuse).

Tu déclares deux fonctions : l'une est une fonction-membre, sans
paramètre, c'est le corps "utile" de ton thread. L'une est soit une
fonction globale, soit une fonction-membre statique, avec un paramètre
void * ; c'est celle que tu donnes à _beginthread() et elle l'appelle la
première après avoir converti son paramètre en maclasse *. En gros :

class maclasse
{
//...
static void thread_relay(void *);
void thread_body();
void start();
//...
};

//static
void maclasse::thread_relay(void *pParam)
{
maclass *pThis = reinterpret_cast<maclasse *>(pParam);
// tests d'usage...
pThis->thread_body();
}

void maclasse::thread_body()
{
// ton traitement ici
}

// Lancement depuis une autre fonction-membre
void maclasse::start()
{
_beginthread(thread_relay,0,this);
}

// Lancement depuis l'extérieur
maclasse monobjet;
_beginthread(maclasse::thread_relay,0,&monobjet);


--
___________ 12/08/2005 00:34:59
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763