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

Threads & Processus C++ Discussion :

Visual Studio : erreur c2664 : 'CreateThread'


Sujet :

Threads & Processus C++

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 34
    Points : 20
    Points
    20
    Par défaut Visual Studio : erreur c2664 : 'CreateThread'
    Bonsoir,

    Je poste ce message car je n'arrive pas à résoudre l'erreur C2664 sous VS2008 (Winform).
    1>.\WifibotApp.cpp(34) : error C2664: 'CreateThread'*: impossible de convertir le paramètre 3 de 'overloaded-function' en 'LPTHREAD_START_ROUTINE'
    J'ai pourtant bien fait attention à suivre la FAQ http://cpp.developpez.com/faq/vc/?pa...keWorkerThread et bien d'autres sujets traitants ce problème, mais rien n'y fait.

    Voici mon code :

    WifibotForm .h :
    Code : 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
    27
    28
    #include "WifibotClient.h"
    #pragma once
     
    namespace WifibotApp {
     
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    	using namespace System::Threading;
     
     
    	public ref class WifibotForm : public System::Windows::Forms::Form
    	{
    	public:
     
    		static DWORD WINAPI Thread_Send (LPVOID lpParam);
    		void Thread_Send(void);
     
    		DWORD dwthread_sendID1;
    		HANDLE hthread_send1;
     
             }
     
    ...
    }
    WifibotApp .ccp :
    Code : 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
    27
    28
    29
    30
    31
    32
    33
    34
    #include "WifibotForm.h"
     
    using namespace WifibotApp;
     
    [STAThreadAttribute]
     
    void WifibotForm::btnConnection_Click(System::Object ^sender, System::EventArgs ^e){
    	char* addIp = "127.0.0.1";
    	int port = 15020;
     
    	if(robot.ConnectToRobot(addIp, port) == 0){
    		robot.ConnectToRobot(addIp, port);
    		btnConnection->Visible = false;
    		btnDeconnection->Visible = true;
     
                    //problème à cette ligne
    		hthread_send1=CreateThread(NULL, 0, Thread_Send, this, 0, &dwthread_sendID1);
     
    		running = true;
    	}
    	else
    		MessageBox::Show("La connexion a échouée" , "Connexion", MessageBoxButtons::OK);
    }
     
    void WifibotForm::Thread_Send(void){
       //code
    }
     
    DWORD WINAPI WifibotForm::Thread_Send (LPVOID p){	
    	WifibotForm ^me = (WifibotForm ^)p; //code managé "*" devient "^"
    	me->Thread_Send ();
    	return 0;
    }
    ...
    Je ne comprends pas ce qui ne va pas, et en quoi ma fonction est surchargée.

    A noter aussi que cette erreur est aussi présente.
    1>.\WifibotApp.cpp(94) : error C2440: 'cast de type'*: impossible de convertir de 'LPVOID' en 'WifibotApp::WifibotForm ^'
    J'ai essayé un const_cast, dynamic_cast et reinterpret_cast mais en vain.

    Cordialement,
    Tehko

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Le 3eme paramètre de CreateThread doit être une fonction libre ou statique, et non une fonction membre de classe comme tu essaie de faire. Il ête peut-être possible de moyenner avec des adapteurs de la stl, mais là tu es en C++/CLI donc je ne m'avancerai pas trop, car c'est un langage que je ne connais pas.

    La deuxième erreur je n'ai pas la moindre idée, désolé. C'est un problème spécifique au C++/CLI, tu devrais plutôt poser ta question sur le sous-forum dédié.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  3. #3
    screetch
    Invité(e)
    Par défaut
    je ne pense pas que CreateThread fonctionne en C++ managé, enfin je ne suis pas sûr

  4. #4
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 34
    Points : 20
    Points
    20
    Par défaut
    Merci pour votre rapidité de réponse.

    r0d, j'ai un peu de mal à te suivre. Le troisième paramètre de ma fonction est bien statique (cf l.19 du .h), non !?
    Par rapport aux adaptateurs de la STL, je ne sais pas trop quoi faire. Est-ce que tu pourrais m'apporter des précisions à ce sujet car j'ai du mal à voir ce qu'il faut réaliser exactement. Disons que je suis loin d'être fortiche en c++.

    screetch, c'est peut-être le cas. J'ai essayé d'utiliser la fonction AfxBeginThread plutôt que CreateThread mais comme j'inclue déjà <windows.h> et qu'il faut inclure <afxwin.h> pour utiliser AfxBeginThread je rencontre une erreur.
    1>c:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\afxv_w32.h(16) : fatal error C1189: #error : WINDOWS.H already included. MFC apps must not #include <windows.h>
    J'ai pas trouvé le moyen de la contourner...

    Autrement, à tout hasard, il y a possibilité de faire un projet Winform sans utiliser du code c++ managé ?

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Tehko Voir le message
    r0d, j'ai un peu de mal à te suivre. Le troisième paramètre de ma fonction est bien statique (cf l.19 du .h), non !?
    Ha oui effectivement, j'avais mal vu, pardon

    Citation Envoyé par Tehko Voir le message
    Par rapport aux adaptateurs de la STL, je ne sais pas trop quoi faire. Est-ce que tu pourrais m'apporter des précisions à ce sujet car j'ai du mal à voir ce qu'il faut réaliser exactement.
    Les adaptateur ce sont des petites classes/fonctions qui permettent de "transformer" la signature des fonctions. Enfin, vu que ta fonction est statique, oublie ça.

    Citation Envoyé par Tehko Voir le message
    Autrement, à tout hasard, il y a possibilité de faire un projet Winform sans utiliser du code c++ managé ?
    Oui, en programmant en C#
    Sinon oui c'est possible, je l'ai fait il y a longtemps mais je ne me souviens plus comment on fait. Loic, si tu passes par là...
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Tehko Voir le message
    J'ai essayé d'utiliser la fonction AfxBeginThread plutôt que CreateThread mais comme j'inclue déjà <windows.h> et qu'il faut inclure <afxwin.h> pour utiliser AfxBeginThread je rencontre une erreur.
    Et si tu inclus "stdafx.h" au lieu de afxwin.h?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  7. #7
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 34
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par r0d Voir le message
    Et si tu inclus "stdafx.h" au lieu de afxwin.h?
    Non, ça ne fonctionne pas.
    1>c:\...\wifibotapp\WifibotForm.h(250) : error C3861: 'AfxBeginThread'*: identificateur introuvable
    Selon la libraire MSDN, il est requis d'ajouter <afxwin.h> dans l'en-tête pour utiliser AfxBeginThread.

  8. #8
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 34
    Points : 20
    Points
    20
    Par défaut
    Du cout je suis partis sur une autre façon de faire des threads et qui est censé être compatible avec le c++ managé.
    Voici le code :

    WifibotForm.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    using namespace System::Threading;
    public ref class WifibotForm : public System::Windows::Forms::Form
    	{
    	public:
    		Thread ^Thread_send;
    		static void Thread_Send();
    ...
    }
    WifibotApp.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    System::Void WifibotForm::btnConnection_Click(System::Object ^sender, System::EventArgs ^e){
            //erreur à cette ligne
    	Thread_send = gcnew Thread(gcnew ThreadStart(this, &WifibotForm::Thread_Send));
     
    	Thread_send->Start();
    	running = true;
    }
     
    static void Thread_Send(void){
    	//code
    }
    J'ai cette erreur ci :
    1>.\WifibotApp.cpp(34) : error C3350: 'System::Threading::ThreadStart'*: un constructeur délégué attend 1 argument(s)
    Je ne comprends pas en quoi il manque un argument.

  9. #9
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 34
    Points : 20
    Points
    20
    Par défaut
    Au final, j'ai résolu mon problème en abandonnant les threads et en utilisant des timers.

    Cordialement,
    Tehko

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

Discussions similaires

  1. OpenProcess visual studio erreur
    Par france38 dans le forum VC++ .NET
    Réponses: 0
    Dernier message: 20/09/2010, 18h41
  2. Visual Studio : erreur LNK1120
    Par scoubida42 dans le forum Visual C++
    Réponses: 3
    Dernier message: 24/03/2009, 11h27
  3. Réponses: 0
    Dernier message: 13/12/2008, 12h46
  4. Réponses: 2
    Dernier message: 08/12/2008, 13h32

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