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

C++ Discussion :

Les threads


Sujet :

C++

  1. #1
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut Les threads
    Salut,
    J’ai un problème avec les threads :^/
    J’assaille de passer en paramètre une variable dans un thread mais cela ne marche pas en C++ par contre en C ça marche :^/

    Voici le code que j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DWORD WINAPI th(LPVOID p)
    {
        char * parametre = (char*) p;
        //...
    }
     
    main()
    {
        CreateThread(NULL, 0, th , &"3", 0, NULL);
        //...
    }
    Savez-vous pourquoi ce code marche qu’en C et pas en C++ et qu’es qu'il faut faire pour remédier à ça ?

    Merci

  2. #2
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut Re: Les threads
    Citation Envoyé par Ekinoks
    Salut,
    J’ai un problème avec les threads :^/
    J’assaille de passer en paramètre une variable dans un thread mais cela ne marche pas en C++ par contre en C ça marche :^/

    Voici le code que j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DWORD WINAPI th(LPVOID p)
    {
        char * parametre = (char*) p;
        //...
    }
     
    main()
    {
        CreateThread(NULL, 0, th , &"3", 0, NULL);
        //...
    }
    Savez-vous pourquoi ce code marche qu’en C et pas en C++ et qu’es qu'il faut faire pour remédier à ça ?

    Merci
    Salut.

    Ben moi ça marche en C++...

  3. #3
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut
    Ca alors !
    moi le compilateur me met ca :
    - invalid conversion from `const void*' to `void*'
    - initializing argument 4 of `void* CreateThread(_SECURITY_ATTRIBUTES*, DWORD, DWORD (*)(void*), void*, DWORD, DWORD*)'

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Eh bien, étrangement, on dirait que ton &"3" (qui n'est pas un char *, mais plutôt un char **, à mon avis ce n'est pas ce que tu voulais) est interprété comme un pointeur vers des données constantes (const void *). En C++, on ne peut pas le convertir directement en void * : il te vaut soit un cast de type C, soit un const_cast


    Edit: à propos du &"3" devenant un const void *, il semblerait que le compilateur C++ (celui de Visual, du moins) appelle la fonction "operator void *" au lieu de "operator bool" quand on teste directement un objet... (c'est le cas pour cin, ou alors c'est le debugger qui est bogué)...
    Pourtant, dans dev-c++, ce ne doit pas être cela, puisqu'il n'y a pas de "operator void *"...

    Edit 2: le texte en rouge est faux (il serait barré s'il pouvait l'être): J'ai rouvert mon livre sur le C++, c'est toujours "operator void *" qui est utilisé.
    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.

  5. #5
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Oui, j'ai oublié. Ca marche avec visual C++.net 2003.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2004
    Messages : 54
    Par défaut
    Citation Envoyé par Médinoc
    Eh bien, étrangement, on dirait que ton &"3" (qui n'est pas un char *, mais plutôt un char **, à mon avis ce n'est pas ce que tu voulais) est interprété comme un pointeur vers des données constantes (const void *). En C++, on ne peut pas le convertir directement en void * : il te vaut soit un cast de type C, soit un const_cast
    En fait, ce qui ce passe c'est que tu envoie comme paramètre un pointeur sur une constante. Le problème c'est que dans le prototype de la fonction CreateThrea, rien n'indique que cette valeur ne sera pas modifiée. Or comme une constante n'est pas censée être modifiée, bah t'as une erreur.
    (rmq: le C est moins restrictif à ce niveau là, voilà pourquoi ça marche).

    Solution:
    fait un truc du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char*a = "3";
     CreateThread(NULL, 0, th , &a, 0, NULL);

  7. #7
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut
    Effectivement c'été bien cela !

    Merci pour votre aide =) et dessolé pour ma réponse tardive :^/

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

Discussions similaires

  1. Aide sur les Threads
    Par themoye dans le forum MFC
    Réponses: 24
    Dernier message: 06/03/2005, 15h02
  2. Les Threads... J'en remet une couche :)
    Par Higestromm dans le forum C++
    Réponses: 5
    Dernier message: 17/11/2004, 12h19
  3. Gestion des message windows dans les threads
    Par billyboy dans le forum Windows
    Réponses: 5
    Dernier message: 06/10/2003, 17h25
  4. Question simple sur les threads :)
    Par momox dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/06/2003, 04h13
  5. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59

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