j'ai pas bien pigé ta question mais j'essaie d'y repondre :)
si tu passes une fonction non statique comme parametre d'un thread, pourquoi cela ne compile t'il pas?
tout simplement parce que la convention d'appel de ta methode nonstatique de ta classe n'est pas la meme que celle d'une fonction'classique'. Les parametres de la fonction/methode sont bien mis sur lapile, mais dans le cas d'un appel d'une fonction membre non statique,le compilateur (vc 6 du moins) stocke dans edx la valeur dupointeur this, puis appelle la methode "normalement".
en gros si tu ecris ceci:
class test
{
private:
std::string message;
public:
void SetMessage(const char* nvomessage)
{
message = nvomessage;
}
}
test ObjetTest;
ObjetTest.SetMessage( "salut !");
que se passe t'il a ce moment?
pour appeler SetMessage, le compilo place l'adresse de ObjetTest dansedx, puis il empile l'adresse de la chaine "salut !" sur la pile, et lail appelle la fonction SetMessage.
A l'interieur de cette fonction, le compilo peut connaitre l'adresse dustd::string message de l'objet ObjetTest, car celui ci se retrouvefacilement a partir de l'adresse de this qui est contenue dans edx (ilest par exemple a l'adresse edx, ou edx+4, ou ... tout depend del'existence ou non d'autres champs dans la classe)
Mais maintenant si j'ai une fonction quelconque:
void DireBonjour(const char* msg)
{
std::cout << "bonjour : " << msg << endl;
}
Pour appeler cette fonction, pas besoin de remplir edx... c'est pas une fonction membre d'une classe.
Si tu appelles CreateThread, le compilo t'empeche de passer unefonction non statique, car CreateThread ne va pa toucher a edx qui doitpourtant imperativement contenir le pointeur this avant l'appel d'unefonction membre non statique. Il n'y touche pas, car d'habitude il n'ya pas besoin d'y toucher ...
tu peux feinter en faisant ca:
class test
{
static int functhread(test* param)
{
if (!param)
return 0;
test& theObject = *param;
// mtnt theObject designe l'objet que tu avais créé
theObject.AppelFuncThreadNonStatique();
// etc...
return 1;
}
void AppelFuncThreadNonStatique(void)
{
// ce que tu veux ... c 'est pas ici une fonction statique
}
}
void main
{
test ObjetTest;
DWORD ThreadId = 0;
CreateThread(NULL, NULL, test::functhread, &ObjetTest, NULL, &ThreadId);
Sleep(INFINITE);
}
et voila si j'ai pu t'eclairer ....
