IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Aide sur Multi-Threading


Sujet :

Windows

  1. #1
    Membre régulier Avatar de Fred2209
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Points : 105
    Points
    105
    Par défaut Aide sur Multi-Threading
    Salut,

    J'ai un petit souci, j'ai bien parcouru le tuto de Bob et la partie Multi-Thread...

    Seulement lorsqu'on crée une classe CThreadProc rien que pour les fonctions déclaré "DWORD WINAPI" et que par le MainDlg je crée un pointeur vers cette classe...

    Je n'arrive pas à lancer le thread, je fais :

    D'abord je déclare mon pointeur :

    Ensuite je l'initialise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thread = new CThreadProc();
    Ensuite je lance le thread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DWORD ThreadId;
    
    CreateThread(NULL,NULL,Thread->MonThread,NULL,NULL,&ThreadId);

    Et là j'ai l'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    error C2664: 'CreateThread' : cannot convert parameter 3
     from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)'
    Et je ne pige pas si quelqu'un peut m'éclairer...
    " l'imagination est plus importante que le savoir. "
    Albert Einstein.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 568
    Points
    41 568
    Par défaut
    Déjà, tu es supposé passer l'adresse de la fonction statique à CreateThread(), donc si tu as besoin du pointeur c'est qu'il y a un problème.
    Ensuite, tu dois passer en paramètre le pointeur vers ton objet.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre régulier Avatar de Fred2209
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Points : 105
    Points
    105
    Par défaut
    Et MonThread est déclaré comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DWORD WINAPI CThreadProc::MonThread(LPVOID lpParam);
    " l'imagination est plus importante que le savoir. "
    Albert Einstein.

  4. #4
    Membre régulier Avatar de Fred2209
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Points : 105
    Points
    105
    Par défaut
    Citation Envoyé par Médinoc
    Déjà, tu es supposé passer l'adresse de la fonction statique à CreateThread(), donc si tu as besoin du pointeur c'est qu'il y a un problème.
    Ensuite, tu dois passer en paramètre le pointeur vers ton objet.

    Médinoc, je suis désolé mais pourrais tu m'expliquer un peu plus ce que tu veux dire par "l'adresse de la fonction statique" et "le pointeur vers ton objet"...

    Je te remercie...
    " l'imagination est plus importante que le savoir. "
    Albert Einstein.

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 568
    Points
    41 568
    Par défaut
    Ce n'est pas expliqué dans "le tuto de bob" ou dans la FAQ ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre régulier Avatar de Fred2209
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Points : 105
    Points
    105
    Par défaut
    Si justement je fais exactement la même chose et j'ai cette erreur qui remonte....

    Voilà les paramètres de CreateThread() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    HANDLE WINAPI CreateThread(
      LPSECURITY_ATTRIBUTES lpThreadAttributes,
      SIZE_T dwStackSize,
      LPTHREAD_START_ROUTINE lpStartAddress,
      LPVOID lpParameter,
      DWORD dwCreationFlags,
      LPDWORD lpThreadId
    );
    Et en paramètre 3, donc "LPTHREAD_START_ROUTINE lpStartAddress" dans l'exemple du projet 8 du tuto de bob il est mis le nom de la fonction et lorsque je le fais j'ai l'erreur C2664...

    C'est pour cela que je viens demander de l'aide car je suis sur le site de msdn mais je n'arrive pas à comprendre pourquoi cette erreur me remonte...
    " l'imagination est plus importante que le savoir. "
    Albert Einstein.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 568
    Points
    41 568
    Par défaut
    Exemple simple non-compilé, non-testé:

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    class CUneClasse
    {
    public:
       static DWORD WINAPI SThreadProc(LPVOID pParam);
    private:
       DWORD ThreadProc(void);
    };
     
    DWORD WINAPI CUneClasse::SThreadProc(LPVOID pParam)
    {
       CUneClasse * pObj = static_cast< CUneClasse * >(pParam);
       DWORD res = pObj->ThreadProc();
       return ret;
    }
     
     
    int main(void)
    {
       CUneClasse obj;
       HANDLE hThread = CreateThread(NULL, 0, CUneClasse::SThreadProc, &obj, 0, NULL);
       std::cout << "Coucou en multithread!" << std::endl;
     
       WaitForSingleObject(hThread, INFINITE);
       CloseHandle(hThread);
       return 0;
    }
    Note: Comme l'indique la doc de CreateThread(), il faudrait utiliser _beginthreadex() à la place, car rares sont les programmes qui n'utilisent pas la C Run-Time Library (CRT)...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre régulier Avatar de Fred2209
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Points : 105
    Points
    105
    Par défaut
    Merci Médinoc, ça y est ça marche j'ai compris je te remercie pour ton temps passé...

    " l'imagination est plus importante que le savoir. "
    Albert Einstein.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide développement multi Thread
    Par totoletoto dans le forum C++
    Réponses: 6
    Dernier message: 13/05/2010, 17h55
  2. Aide sur les Thread
    Par walid kh dans le forum VB.NET
    Réponses: 8
    Dernier message: 06/04/2010, 12h18
  3. besoin d'aide sur les thread
    Par demonofshadow dans le forum Windows Forms
    Réponses: 8
    Dernier message: 14/01/2010, 15h07
  4. aide sur les thread
    Par aurel_le_ouf dans le forum C#
    Réponses: 1
    Dernier message: 26/03/2008, 16h16
  5. Aide sur les Threads
    Par themoye dans le forum MFC
    Réponses: 24
    Dernier message: 06/03/2005, 15h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo