C++ Fil en fonction de membre
puis-je utiliser le fil dans la fonction de membre d'appeler une fonction membre pour C++ sous windows? Si oui, comment la mettre en œuvre? Voici l'exemple de
void Class::fun_1(void){
_beginthread(fun_2, 0, NULL); //This is the error line :: function call missing argument list; use '&Class::fun_2' to create a pointer to member
}
void Class::fun_2(void){
printf("hello");
}
Grâce
- Qu'est-ce que
_beginthread
? - Bolas,
_beginthread
est une fonction de la sombre du vieux monde appeléwin32
. msdn.microsoft.com/en-us/library/kdzttdcb(v=vs. 80).aspx - Bolas: msdn.microsoft.com/en-us/library/kdzttdcb.aspx
- double possible de _beginthreadex fonction membre statique
- Toute autre fournir la fonction de Thread dans windows C++?? sauf _beginthread
- vous devez utiliser la plus récente et la plus sûre
CreateThread
API, le vieux crt filetage routines ont beaucoup de incompatabilities - ne fait pas partie de win32
- Pas si le fil lui-même appelle C runtime fonctions. Le dernier paragraphe de la section Remarques: "Un thread dans un fichier exécutable qui appelle la bibliothèque runtime C (CRT) doivent utiliser le
_beginthreadex
et_endthreadex
fonctions pour la gestion des threads..."
Vous devez vous connecter pour publier un commentaire.
Il y a en fait plusieurs questions se posent ici:
_beginthread()
fonction. La fonction nécessite un pointeur vers une fonction globale ou statique.&
pour obtenir un pointeur vers le membre (le compilateur a été se plaindre à vous sur ce point).Parce que vous ne pouvez pas passer un pointeur de fonction membre pour
_beginthread()
, vous devez créer un wrapper de la fonction globale ou statique pour le faire fonctionner. Voici une façon de faire que cela se produise:Bien sûr, vous devez en quelque sorte de garantir que le
MyClass
objet continue d'exister aussi longtemps quefun_2()
est en cours d'exécution, ou pas si bonnes choses vont arriver. Si vous avez beaucoup de ne pas avoir à vous soucier de cela, pensez à utiliser Coup de pouce.Fil qui fait cela et beaucoup plus pour vous.fun_2()
est encore une fonction membre deMyClass
.fun_2_wrapper()
est là pour que_beginthread()
pouvez appeler votre fil de routine.La façon habituelle de faire cela est d'utiliser une fonction membre statique qui appelle la fonction membre à l'aide d'un vide pointeur de l'objet d'origine.
Toutefois, si vous commencez à avoir besoin de passer des arguments à ces fonctions, les choses deviennent un peu plus compliqué. Je regarderais à l'aide de boost::thread et boost::bind au lieu de rouler votre propre.
boost::bind
oustd::bind
directement avec_beginthread
ainsi sauter la nécessité d'une fonction statique?_beginthread
qui doivent être d'un certain type de fonction. Cependant, vous pouvez créer un wrapper pour_beginthread
dans le style deboost::thread
qui permettra d'accepter plus générale des fonctions vous permettant l'utilisation de bind.