2010-05-17 4 views
4

Je donne les résultats suivants:fonction de fil de Strange C invocation

class DThread 
    { 
     virtual void run()=0; 

    _beginthreadex(NULL,0,tfunc,this,0,&m_UIThreadID); // class itself being passed as param to thread function... 

    static unsigned int __stdcall tfunc(void* thisptr) 
     { 
      static_cast<DThread*>(thisptr)->run(); 
      return 0; 
     } 

//other stuff 

} 

La fonction d'exécution est mis en œuvre dans une classe dérivée.

Pourquoi la fonction appelée dans le thread est-elle appelée via un pointeur this? Est-ce une bonne pratique?

Ne peut-il pas être appelé directement?

La fonction réelle qui doit être exécutée est dans la classe dérivée.

Ma question est

+2

Votre question est ...? – Anthony

+0

Pourquoi la fonction appelée dans le thread est-elle appelée via un cast ce pointeur? Est-ce une bonne pratique? Ne peut-il pas être appelé directement? –

+1

Il n'y a pas de "ceci" dans une fonction membre statique. – eemz

Répondre

2

La plupart des API de threads au niveau de la plateforme sont des C bare-bones et prennent un simple pointeur pour fonctionner dans un nouveau thread. Cela signifie en C++ que cette fonction doit être une fonction libre ou un membre statique. Aucun d'entre eux ne donne accès à une instance de classe. La solution de contournement pour créer des classes de threads statefull est d'exploiter l'argument supplémentaire "pass-through" de l'appel de création de threads (généralement un pointeur qui est ensuite passé à la fonction exécutée dans le nouveau thread) et lui donner un pointeur sur la classe c'est-à-dire this. La fonction statique pourrait alors appeler un membre [virtuel], disons run() ou quelque chose comme ça.

3

fonctions de discussion ne sont pas 'conscients classe'. Votre implémentation les rend conscients de la classe afin que la fonction 'run' dérivée ait accès aux membres de la classe.

1

La fonction _beginthreadex est une fonction C. Il ne sait rien sur C++. Pour accéder à un membre C++ depuis la fonction de thread, vous devez le convertir.

4

_beginthreadex s'attend à une fonction de style C (stdcall), elle ne peut pas utiliser une fonction membre C++ car elle n'a aucune connaissance de C++. La façon d'exécuter une fonction membre est de passer un pointeur sur un objet et d'appeler la fonction membre à l'intérieur de cette fonction. Une telle fonction est souvent appelée un trampoline.