begin process at 2010 03 20 16:14:09
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Général

 > 

Pointeur sur methode, template, etc...


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Pointeur sur methode, template, etc...

lundi 1 juin 2009 à 17:12:56 | Pointeur sur methode, template, etc...

sheorogath

Membre Club Administrateur CodeS-SourceS
Bonjour, Mon probleme est un peu particulier, je voudrais lancer un Thread sur un methode de classe: pour se faire j'ai fait une fonction de ce genre: [CODE] template void thread_callback(std::pair *pair) { K i = pair->first; K p = pair->second; i->*p(); } [/CODE] et je voudrais l'appeler de cette maniere; [CODE] std::pair *p = new std::pair(this->sock, ZSocket::*startSelect); this->thread = Thread::createThread(thread_callback, p); [/CODE] Mais ca ne marche pas ... Meme la paire ne compile pas ... Si vous aviez des infos, des liens ou meme la solution ca m'aiderait :) Merci d'avance Sortie du compilateur (VC9): [CODE] :\documents and settings\daedric\bureau\zap\src\network\znetwork.cpp(36) : error C2059: syntax error : '::*' c:\documents and settings\daedric\bureau\zap\src\network\znetwork.cpp(38) : error C2065: 'p' : undeclared identifier c:\documents and settings\daedric\bureau\zap\src\network\znetwork.cpp(39) : error C2143: syntax error : missing ';' before '}' c:\documents and settings\daedric\bureau\zap\src\network\znetwork.cpp(42) : error C2143: syntax error : missing ';' before '}' c:\documents and settings\daedric\bureau\zap\src\network\znetwork.cpp(42) : fatal error C1004: unexpected end-of-file found [/CODE]

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
lundi 1 juin 2009 à 17:16:00 | Re : Pointeur sur methode, template, etc...

sheorogath

Membre Club Administrateur CodeS-SourceS
Je reposte:

Bonjour,
Mon probleme est un peu particulier, je voudrais lancer un Thread sur un methode de classe et pour se faire j'ai fait une fonction de ce genre:

template <typename K>
void thread_callback(std::pair<K, K> *pair)
{
K i = pair->first;
K p = pair->second;

i->*p();
}

et je l'appel comme ca:

void ZNetwork::startNetworkThread()
{
std::pair<ZSocket *, ZSocket::*startSelect> *p =
new std::pair(this->sock, ZSocket::*startSelect);
this->thread = Thread::createThread(thread_callback, p);
}

Ma classe Thread lance CreateThread sous windows et pthread_create sous linux

Mais ca ne marche pas ... Meme la paire ne compile pas ... Si vous aviez des infos, des liens ou meme la solution ca m'aiderait bien :)

voila merci d'avance

Sortie du compilateur (vc9):

c:\documents and settings\daedric\bureau\zap\src\network\znetwork.cpp(36) : error C2059: syntax error : '::*'
c:\documents and settings\daedric\bureau\zap\src\network\znetwork.cpp(38) : error C2065: 'p' : undeclared identifier
c:\documents and settings\daedric\bureau\zap\src\network\znetwork.cpp(39) : error C2143: syntax error : missing ';' before '}'
c:\documents and settings\daedric\bureau\zap\src\network\znetwork.cpp(42) : error C2143: syntax error : missing ';' before '}'
c:\documents and settings\daedric\bureau\zap\src\network\znetwork.cpp(42) : fatal error C1004: unexpected end-of-file found
lundi 1 juin 2009 à 18:09:18 | Re : Pointeur sur methode, template, etc...

sheorogath

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
probleme resolu:

template <typename K, typename L>
#if WIN32
DWORD WINAPI thread_callback(LPVOID param)
#else
void thread_callback(void *param)
#endif
{
std::pair<K, L> *pair = (std::pair<K, L> *)param;
K i = pair->first;
L p = pair->second;

(i->*p)();
#if WIN32
return (0);
#endif
}

void ZNetwork::startNetworkThread()
{

std::pair<ZSocket *, meth> p(this->sock, &ZSocket::startSelect);
this->thread = Thread::createThread(thread_callback<ZSocket *, meth>, &p);
}
lundi 1 juin 2009 à 18:48:38 | Re : Pointeur sur methode, template, etc...

CptPingu

Ton template me parait bizarre. Tu es sûr de vouloir faire un "template <typename K>" et pas un "template <typename K, typename K2>" ?
La pair ne peut avoir le même type dans ses deux paramètres.

Je te propose un petit exemple, qui répondra peut être à ta question:

#include <iostream>
#include <utility>

#define callMemberFunction(object, ptrToMember)  ((object).*(ptrToMember))

class ZSocket
{
public:
  void startSelect()
  {
    std::cout << "kikoo" << std::endl;
  }
};

typedef void (ZSocket::*func) ();

template <typename Object, typename Method>
void thread_callback(std::pair<Object, Method>* pair)
{
  Object obj = pair->first;
  Method met = pair->second;
  (obj.*met)();
}

// Perso je mettrais plutot une reference:
//
// template <typename Object, typename Method>
// void thread_callback(std::pair<Object, Method>& pair)
// {
//   Object obj = pair.first;
//   Method met = pair.second;
//   (obj.*met)();
// }

int main()
{
  ZSocket sock;
  func pFunc = &ZSocket::startSelect;

  (sock.*pFunc)();
  callMemberFunction(sock, pFunc) ();
  std::pair<ZSocket, func> p(sock, pFunc);

  thread_callback(&p);

  return 0;
}

lundi 1 juin 2009 à 18:51:32 | Re : Pointeur sur methode, template, etc...

CptPingu

Oupss, j'avais pas rafraîchit la page... Problème résolu, c'est l'important :p


Cette discussion est classée dans : code, thread, error, documents, pair


Répondre à ce message

Sujets en rapport avec ce message

gotoxy - VC++ 6 [ par BsEtZeOpLhD ] SalutJ'utilise Visual C++ 6, et je n'arrive pas a faire fonctionner gotoxy(). Voici le code que j'utilise :#include #include <b Prob de thread [ par sebastienbro ] Bonjour, j'ai un problème avec des thread, je n'arrive pas a en créer un :(Voici mon code : HANDLE hThread1;DWORD dwThreadId1;DWORD WINAPI T Terminer un thread [ par vecchio56 ] RebonjourJ'ai crée un thread de la manière suivante:HANDLE hThread = CreateThread(0, 0, ThreadProc, &ts, 0, &dwThreadId);et je à propos des threads [ par GUERRIER_ABSOLU ] Salut, je voudrais savoir s'i quelqu'un a déjà essayé d'appeler une fonction dans un thread et a remarqué quelque chose d'innatendu. En fait quand j'a WSAAsyncSelect ... [ par DeAtHCrAsH ] A quel endroit dans mon code dois-je appeller cette fonction ?...WSAAsyncSelect(m_Socket, hDlg, WM_SOCKET, FD_READ | FD_WRITE | FD_CONNECT | FD_CLOSE) parse error dans un fichier .rc ? [ par Jeffray ] Bonjour,Une parse error dans un fichier .rc, j'utilise dev c++ 4.9.8.0.voici le code :IDD_ABOUT DIALOG DISCARDABLE 70, 50, 206, 102STYLE DS_MODALFRA Class & CreateThread [ par Renfield ] Bonjour, j'ai un petit soucis de compilation...dans une classe, je voudrais créer un Thread. ma proc est définie comme cela :LPTHREAD_START_ROUTINE Build Error avec Dev-Cpp + SDL [ par Rouliann ] Salut tout le monde!Alors voila le probleme, g tapé un code tt simple en C++ avec la SDL et le compilateur me dit : C:\Dev-Cpp\...\Makefile.win [Build Lancement thread successif (ordonnés) [ par themaste ] Salut!Voila, j'ai une question d'ordre propreté du code. En fait, j'ai plusieurs thread, et j'aimerais pouvoir les lancés les un après les autres..je fatal error C1075 [ par thetoto52 ] Je suis en train de déveloper un projet en c++ au lycé.Mon projet marchais bien quand j'étais au lycé il me semble et quand je l'ai ramené chez moi et


Nos sponsors


Sondage...

Comparez les prix


HTC Hero

Entre 550€ et 550€

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,733 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales