Partage
  • Partager sur Facebook
  • Partager sur Twitter

treads dans une classe

Sujet résolu
    17 décembre 2007 à 17:30:31

    Salut,
    Je pense que le titre est plutôt explicite.
    Je voudrais faire une thread dans une classe.
    Je ne sais pas si c'est possible mais si ça ne l'est pas, je veux bien une autre solution.
    C'est en faite un thread qui servirait pour le réseau dans mon petit FPS.

    Merci d'avance.

    Gp2mv3
    • Partager sur Facebook
    • Partager sur Twitter
      17 décembre 2007 à 17:33:26

      dans une class ca ne pose pas de probleme ^^
      • Partager sur Facebook
      • Partager sur Twitter
        17 décembre 2007 à 17:36:21

        Ha, et comment tu l'initialises alors ?
        Moi il me sort des erreurs.
        • Partager sur Facebook
        • Partager sur Twitter
          17 décembre 2007 à 18:14:51

          moi ce que je te propose : comme un thread démarre avec une fonction (et non une méthode) de la forme : (avec l'API Windows)

          int WINAPI fonc(void* param);

          C'est de lancer ton thread depuis une méthode de ta classe, et de passer "this" en parametre : ainsi, tu peux tout de suite relancer dans une méthode. L'inconvénient, c'est que ça sort de l'instance pour y rerentrer.

          1. class truc
          2. {
          3.    int methode_lance_thread();
          4.    int threadedmethod();
          5. };
          6. int truc::methode_lance_thread()
          7. {
          8.    HANDLE h1 = CreateThread(NULL,0,fonc1,this,0,0);
          9.    // h1 peut etre membre de la classe.
          10.   ....
          11. }
          12. int WINAPI fonc1(void* v)
          13. {
          14.    truc* = (truc*)v;
          15.    return v->threadedmethod();
          16. }
          17. int truc::threadedmethod()
          18. {
          19.   // la suite
          20. }



          • Partager sur Facebook
          • Partager sur Twitter

          Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

            17 décembre 2007 à 18:22:10

            je sais pas si tu as vu mais y a un mini tuto sur <lien url="je sais pas si tu as vu mais y a un mini tuto s">developpez.com</lien> qui parle de ça. Alors c'est pas exactement la même chose mais c'est une classe serveur qui lance un thread à chaque fois qu'un client se connecte alors ça pourrait être la même technique pour toi.

            La réponse m'intéresse aussi d'ailleurs ^^
            • Partager sur Facebook
            • Partager sur Twitter
              17 décembre 2007 à 18:40:51

              J'ai suivi la technique de Fvirtman et ça fonctionne.
              Merci.
              • Partager sur Facebook
              • Partager sur Twitter
                17 décembre 2007 à 19:25:20

                question au passage c'est quoi la différence entre int winapi et DWORD WINAPI ? parce que moi j'utilise toujours DWORD
                • Partager sur Facebook
                • Partager sur Twitter
                  17 décembre 2007 à 20:32:44

                  Je pense que pour les threads, tu es obligé de mettre un DWORD mais il faudrait regarder les fichiers de l'API.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 décembre 2007 à 22:20:37

                    Selon le MSDN, le protoype d'une fonction de thread doit être

                    1. DWORD WINAPI ThreadProc(LPVOID lpParam);


                    Sachant que DWORD et LPVOID sont définis comme ceci

                    1. typedef unsigned long DWORD;
                    2. typedef void * LPVOID;


                    int indique un type de retour entier signé, tandis que DWORD indique un type de retour entier long non signé, donc ce n'est pas tout à fait pareil, même si sous Windows c'est presque la même chose (au bit de signe près).

                    Il existe une autre solution, plus dans l'esprit du C++, qui constiste à déclarer la ThreadProc comme une fonction membre statique. L'avantage est qu'il devient possible de faire de cette fonction un membre privé de la classe avec tous les avantages que cela peut comporter au niveau de la maitrise du code.

                    1. #include <windows.h>
                    2. #include <iostream>
                    3. class class1
                    4. {
                    5.     static DWORD WINAPI ThreadProc(LPVOID lpParam);
                    6.     DWORD ThreadFunc();
                    7.     HANDLE hThread;
                    8. public:
                    9.     class1();
                    10.     ~class1();
                    11. };
                    12. class1::class1()
                    13. {
                    14.     hThread = CreateThread(NULL,0,ThreadProc,this,0,NULL);
                    15. }
                    16. class1::~class1()
                    17. {
                    18.     WaitForSingleObject(hThread,INFINITE);
                    19.     CloseHandle(hThread);
                    20. }
                    21. DWORD WINAPI class1::ThreadProc(LPVOID lpParam)
                    22. {
                    23.     class1 * pInstance = static_cast<class1*>(lpParam);
                    24.     return pInstance->ThreadFunc();
                    25. }
                    26. DWORD class1::ThreadFunc()
                    27. {
                    28.     std::cout<< "In thread "<<std::endl;
                    29.     return 0;
                    30. }
                    31. int main(void)
                    32. {
                    33. class1 c;
                    34.     return 0;
                    35. }


                    • Partager sur Facebook
                    • Partager sur Twitter
                    Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug

                    treads dans une classe

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown