Partage
  • Partager sur Facebook
  • Partager sur Twitter

threads

Sujet résolu
    23 août 2007 à 11:38:30

    salut

    alors je commence à apprendre le fonctionnement des threads pour pouvoir faire des application réseaux multijoueurs (je vous averti j'y suis aps encore :p )

    j'ai un code

    1. #include <windows.h>
    2. #include <iostream>
    3. #include <stdlib.h>
    4. using namespace std;
    5. DWORD WINAPI fonc1(int params)
    6. {
    7.         while(1)
    8.         {
    9.                 cout << params << endl;
    10.                 Sleep(10);
    11.         }
    12.         return 0;
    13. }
    14. DWORD WINAPI fonc2(int params)
    15. {
    16.         while(1)
    17.         {
    18.                 cout << params << endl;
    19.                 Sleep(10);
    20.         }
    21.         return 0;
    22. }
    23. int main()
    24. {
    25.         HANDLE h1;
    26.         HANDLE h2;
    27.         CreateThread(NULL,0,fonc1,1,0,0);
    28.         CreateThread(NULL,0,fonc2,2,0,0);
    29.         system("PAUSE");
    30.         TerminateThread(h1,0);
    31.         TerminateThread(h2,0);
    32.         system("PAUSE");
    33.         return 0;
    34. }


    mais mon compilo me sort plein d'erreur

    erreur : invalid conversion from `DWORD (*)(int)' to `DWORD (*)(void*)'
    initializing argument 3 of `void* CreateThread(_SECURITY_ATTRIBUTES*, DWORD, DWORD (*)(void*), void*, DWORD, DWORD*)'
    invalid conversion from `int' to `void*'

    (il me sort deux fois ces trois erreurs car je crée deux threads)

    mais je comprends pas ou il trouve son void* dasn la derniere erreur ! car j'ai bien mis un int dans la parenthèse de la création de threads

    si quelqu'un connaissant les threads pouvait m'aider

    merci d'avance Icare

    EDIT : je suis ce cours là http://www.alrj.org/docs/systeme/win32thread.pdf
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      23 août 2007 à 12:44:50

      Les threads win32 ca puxx.
      Prend boost::threads ( http://www.boost.org/doc/html/thread.html ).
      C'est portable,bien fait et documenté.
      • Partager sur Facebook
      • Partager sur Twitter
        23 août 2007 à 13:11:31

        Citation : Davidbrcz

        Les threads win32 ca puxx.



        Pourquoi ? Il y a des problemes avec les threads win32 ?
        Tu as peut etre raison, il y a peut etre des soucis avec, mais j'aimerais savoir lequels !
        • Partager sur Facebook
        • Partager sur Twitter

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

          23 août 2007 à 13:31:15

          Je dirais en tout cas que c'est pas portable.

          Si il y a un truc portable est dans la prochaine S(T)L qui fait la même chose, autant le prendre.
          • Partager sur Facebook
          • Partager sur Twitter
          Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
            23 août 2007 à 13:35:13

            Oui, c'est vrai, au niveau de la portabilité.
            Mais tu ne peux pas dire "ça puxx" sans arguments derriere....
            J'utilise les threads Win32, et meme s'ils sont partis pour etre remplacés par une prochaine lib standard, ils m'ont déja rendu de bons services !
            • Partager sur Facebook
            • Partager sur Twitter

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

              23 août 2007 à 13:39:39

              En effet le terme français "puxx" ne correspond pas, car ces threads sont en effet très pratique.
              • Partager sur Facebook
              • Partager sur Twitter
              Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                23 août 2007 à 18:07:41

                Ta fonction n'a tout simplement pas le bon prototype: tu es obligé d'avoir une fonction ayant la signature "`DWORD (*)(void*)" (tiens c'était dit o_O ! :lol: )
                donc ton code devrait normalement marcher ainsi (je suis pas très "ami" avec l'APIWin32...):
                1. #include <windows.h>
                2. #include <iostream>
                3. #include <stdlib.h>
                4. using namespace std;
                5. DWORD WINAPI fonc1(void* params)
                6. {
                7.         int param=(int)params;
                8.         while(1)
                9.         {
                10.                 cout << param << endl;
                11.                 Sleep(10);
                12.         }
                13.         return 0;
                14. }
                15. DWORD WINAPI fonc2(void* params)
                16. {
                17.         int param=(int) params;
                18.         while(1)
                19.         {
                20.                 cout << param << endl;
                21.                 Sleep(10);
                22.         }
                23.         return 0;
                24. }
                25. int main()
                26. {
                27.         HANDLE h1;
                28.         HANDLE h2;
                29.         CreateThread(NULL,0,fonc1,(void*)1,0,0);
                30.         CreateThread(NULL,0,fonc2,(void*)2,0,0);
                31.         system("PAUSE");
                32.         TerminateThread(h1,0);
                33.         TerminateThread(h2,0);
                34.         system("PAUSE");
                35.         return 0;
                36. }


                Normalement tu devrais tester si le paramètre n'est pas nul etc...
                • Partager sur Facebook
                • Partager sur Twitter
                  23 août 2007 à 18:22:32

                  dsl altic ton code il marche pas

                  mais au lieu de vous disputez sur l'utilisation de telle ou telle librairie vous pourriez pas m'aider

                  Fvirtman tu aurais pas une idée étant donné que tu t'en sert pas mal apparamment
                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 août 2007 à 18:25:15

                    ton problème vient des signatures de tes fonctions, ça j'en suis sûr :p ...
                    après c'est un problème de transtypage des données, le void* accepte tout et n'importe quoi, il suffit de transtyper.
                    En esperant un peu t'aider.
                    Attend je me suis peut-être tromper sur un truc bête, je vais éditer mon premier message...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 août 2007 à 18:48:57

                      YOUPI !! ton code marche mais le tranpstypage ça marche aussi avec des structures ?

                      du genre :
                      1. struct params{
                      2. int x
                      3. bool y
                      4. };
                      5. //dasn les fonctions
                      6. DWORD WINAPI fonc2(void* param)
                      7. {
                      8.         params w =(params) param;
                      9.         while(1)
                      10.         {
                      11.                 cout << w.x << endl;
                      12.                 Sleep(1000);
                      13.         }
                      14.         return 0;
                      15. }


                      ça marcherait ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        23 août 2007 à 18:54:06

                        Les threads win ca puxx car :
                        • ils sont super pas clair a utiliser.
                        • C'est du C
                        • C'est pas portable.

                        De plus , les threads (en général) ca ne s'utile pas pour dire "J'utilise des threads".
                        Il faut les utiliser dans des cas bien précis car en utiliser amène des problèmes assez chiant(mutex,synchronisation,rendre les fonction thread-safe...) , ca rend une application difficile a débuguer.

                        Pour comparer , voici un exemple thread avec boost(portable , C++ pur)
                        Utilisation de foncteur

                        1. #include <iostream>
                        2. #include <boost/thread/thread.hpp>
                        3. #include <boost/thread/xtime.hpp>
                        4. struct MyThreadFunc {
                        5.    void operator( )( ) {
                        6.       // Do something long-running...
                        7.    }
                        8. };
                        9. int main( ) {
                        10. MyThreadFunc threadFun;
                        11.    boost::thread myThread(threadFun); // Create a thread that starts
                        12.                                       // running threadFun
                        13.    boost::thread::yield( ); // Give up the main thread's timeslice
                        14.                            // so the child thread can get some work
                        15.                            // done.
                        16.    // Go do some other work...
                        17.    myThread.join( ); // The current (i.e., main) thread will wait
                        18.                     // for myThread to finish before it returns
                        19. }
                        • Partager sur Facebook
                        • Partager sur Twitter
                          23 août 2007 à 18:56:45

                          1. struct x *param = reinterpret_cast<struct x*>(params);


                          transtypage version structure ^^

                          @ davidbrz : je suis d'accord que c'est plus simple vu comme ça mais disons que la barrière linguistique est trop grande pour moi (j'entends déjà le "de toute façon l'anglais faudra t'y mettre un jour ou l'autre" => oui ben c'est en cours mais pas encore assez pour lire toute une doc)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            24 août 2007 à 1:40:14

                            Citation : Davidbrcz

                            <Bla bla bla...>


                            Et boost, il a été reconstruit en asm? ou bien bien c'est juste une suite de #ifdef platform orienté objet?
                            • Partager sur Facebook
                            • Partager sur Twitter
                              24 août 2007 à 8:51:49

                              Si vous êtes là que pour troller, vous pouvez partir tout de suite...
                              @Icare: avant de transtyper, test toujours si le paramètre n'est pas nul. Car c'est le genre de petites choses qui peuvent provoquer de belles erreurs d'executions.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                24 août 2007 à 9:44:29

                                Citation : Davidbrcz

                                Les threads win ca puxx car :

                                • ils sont super pas clair a utiliser.
                                • C'est du C
                                • C'est pas portable.


                                De plus , les threads (en général) ca ne s'utile pas pour dire "J'utilise des threads".
                                Il faut les utiliser dans des cas bien précis car en utiliser amène des problèmes assez chiant(mutex,synchronisation,rendre les fonction thread-safe...) , ca rend une application difficile a débuguer.
                                </code>



                                Non mais franchement...
                                Ils ne sont pas clair a utiliser : il suffit d'y lire un peu, et ça devient clair. C'est du C, mais rien ne t'empeche de l'encapsuler dans les classes si ça te chante, la gestion des threads sous Unix étant également du C a la base. Il est possible que Boost encapsule tout simplement ça :) C'est pas portable, je te l'accorde. Quand a la gestion des mutex, etc, j'en connais un rayon la dessus (deadlock), débuggage difficile, etc... Il y a tous les outils qu'il faut pour cela avec l'API Windows :)

                                Si je réagis a cela, ce n'est pas pour te dire que WinApi est mieux que Boost, au contraire, je pense que boost est tres bien et va doucement supplanter l'utiliser de la WinAPI directe pour les threads,
                                mais je réagis a cela, car je pense qu'il ne faut quand meme pas manquer de respect a tous les programmeurs Windows qui ont déja programmé maintes et maintes fois avec la WinAPI.

                                Il ne faut pas dire "ça pue", il faut dire que tu n'aimes pas.
                                • Partager sur Facebook
                                • Partager sur Twitter

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

                                  24 août 2007 à 10:10:27

                                  comment je fais pour tester si une structure est pas nulle ?

                                  1. if(params != NULL)
                                  2. {//transtypage
                                  3. }


                                  je fais comme ça ?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Anonyme
                                    24 août 2007 à 11:15:52

                                    Citation : X


                                    Non mais franchement...
                                    Ils ne sont pas clair a utiliser : il suffit d'y lire un peu, et ça devient clair. C'est du C, mais rien ne t'empeche de l'encapsuler dans les classes si ça te chante, la gestion des threads sous Unix étant également du C a la base. Il est possible que Boost encapsule tout simplement ça :) C'est pas portable, je te l'accorde. Quand a la gestion des mutex, etc, j'en connais un rayon la dessus (deadlock), débuggage difficile, etc... Il y a tous les outils qu'il faut pour cela avec l'API Windows :)


                                    Pour la clairté , disons qu'il faut comprendre la logique avant.
                                    Il 'suffit' d'encapsuler , facile a dire plus difficile a faire.
                                    Les threads unix , c'est aussi du C , mais du 'beau C', ca c'est caca.(comparer)

                                    Ensuite , ya peut être des outils mais un outils avec une main incompétante ne sert a rien.
                                    Pour se servir des threads , il suffit pas de savoir en créet mais avoir aussi une certaine connaissance théorique derière.

                                    Citation : X


                                    Si je réagis a cela, ce n'est pas pour te dire que WinApi est mieux que Boost, au contraire, je pense que boost est tres bien et va doucement supplanter l'utiliser de la WinAPI directe pour les threads,
                                    mais je réagis a cela, car je pense qu'il ne faut quand meme pas manquer de respect a tous les programmeurs Windows qui ont déja programmé maintes et maintes fois avec la WinAPI.

                                    Il ne faut pas dire "ça pue", il faut dire que tu n'aimes pas.


                                    Les threads win32 ca a peut être été le best a une époque mais aujourd'hui il faut le dire , ca pue comparé a ce qu'on a en C++ (bien qu'a la fin , les autres bliothèque vont se reposer la dessue mais on s'en fout).
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      24 août 2007 à 11:17:45

                                      Bon, on pars hors sujet, je n'en dirai pas davantage.
                                      • Partager sur Facebook
                                      • Partager sur Twitter

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

                                      Anonyme
                                        24 août 2007 à 11:23:02

                                        On peut continuer ca par MP si tu le souhaite.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          24 août 2007 à 11:30:05

                                          Non, ça ne m'intéresse pas.
                                          Je ne suis pas la pour débattre de ce genre de choses, et je t'ai déja dit ce que je voulais te dire plus haut, d'autant plus quand le débat commence par un rejet total associé au mot "ça pue".
                                          • Partager sur Facebook
                                          • Partager sur Twitter

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

                                            24 août 2007 à 12:00:56

                                            @icare14:Oui c'est ça ;) . Met y tout tout le code à exécuter, et après tu met un else pour gérer le cas où le paramètre est égal à null.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              24 août 2007 à 15:23:55

                                              merci altic et merci aux autres aussi ^^
                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              threads

                                              × 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