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++/CLI Discussion :

Error C2664 lors d'implantation de Thread


Sujet :

C++/CLI

  1. #1
    Membre actif
    Homme Profil pro
    �tudiant
    Inscrit en
    Ao�t 2016
    Messages
    20
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2016
    Messages : 20
    Par d�faut Error C2664 lors d'implantation de Thread
    Bonjour a tous,
    J'ai un l�ger probl�me, enfin plut�t gros probl�me en faite Je travaille sur Qt Creator et je suis entrain de faire une messagerie. Le probl�me c'est que lors de l'impl�mentation de thread j' ai cette erreur de compilation:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    erreur : C2664: 'std::tuple<void (__cdecl Window::* )(Server),Window *,Server>::tuple(std::tuple<void (__cdecl Window::* )(Server),Window *,Server> &&)'ÿ: impossible de convertir l'argument 1 de 'void (__cdecl Window::* )(Server)' en 'std::allocator_arg_t'
    Bref, j'y comprend rien. Donc je m'en remet a vous. Voila le reste du code.

    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 "window.h"
     
    Window::Window(): QWidget()
    {
          //code pas important
     
         do
        {
            //nothing
        }while(config.getLaunch() == false);
     
        Server myServer(config.getPort(), config.getBroadcast());
        std::thread serverThread(&Window::ListenToClients, this, myServer);//Ligne qui est en faute
     
    }
     
    void Window::Config()
    {
        config.exec();
    }
     
    void Window::ListenToClients(Server server)
    {
        for(int i = 0; i < 100; i++)
        {
            server.ListenNewConnections();
        }
    }

  2. #2
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 503
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 503

  3. #3
    Membre actif
    Homme Profil pro
    �tudiant
    Inscrit en
    Ao�t 2016
    Messages
    20
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2016
    Messages : 20
    Par d�faut
    D�sole d'�tre aussi nul, mais j'y arrive toujours pas :/

  4. #4
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 503
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 503
    Par d�faut
    D�sole d'�tre aussi nul,
    T'es pas nul, c'est assez tricky, m�me dans la documentation.
    Mais les r�ponses sont dedans.

    Regarde les contraintes sur le premier param�tre indiqu�es dans la documentation.

  5. #5
    Membre actif
    Homme Profil pro
    �tudiant
    Inscrit en
    Ao�t 2016
    Messages
    20
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2016
    Messages : 20
    Par d�faut
    Il faut l*'argument en referrence? Je comprends pas...

  6. #6
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 503
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 503
    Par d�faut
    Est-ce que la classe "Window" est copy-constructible, ou mouvable ?

  7. #7
    Membre actif
    Homme Profil pro
    �tudiant
    Inscrit en
    Ao�t 2016
    Messages
    20
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2016
    Messages : 20
    Par d�faut
    Citation Envoy� par bacelar Voir le message
    Est-ce que la classe "Window" est copy-constructible, ou mouvable ?
    Je pense que oui, une classe est copy-constructible. Donc il faut que j'enl�ve le &

  8. #8
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 503
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 503
    Par d�faut
    Je pense que oui, une classe est copy-constructible.
    Une "QWidget", c'est de l'IHM. Une bout d'IHM copy-constructible, j'en doute, �a serait une grosse peau de banane.

  9. #9
    Membre actif
    Homme Profil pro
    �tudiant
    Inscrit en
    Ao�t 2016
    Messages
    20
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2016
    Messages : 20
    Par d�faut
    Mais je ne fais pas passer window par r�f�rence ? J'ai essay� avec std::ref, sa n'a rien donn�

    EDIT:

    J'ai supprimer le this du code
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    std::thread serverThread(&Window::ListenToClients, myServer);
    Mais j'ai toujours une erreur m�me si celle-ci est diff�rente:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    erreur : C2661: 'std::tuple<void (__cdecl Window::* )(Server),Server>::tuple'ÿ: aucune fonction surchargée ne nécessite 2 arguments

  10. #10
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 503
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 503
    Par d�faut
    Je n'ai qu'un VS2012 sans Qt sous la main mais le code suivant compile :

    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
    35
    36
    #include "stdafx.h"
     
    #include <thread>
    #include <iostream>
     
     
    class Server{
    public:
    	void ListenNewConnections(){};
    };
     
    class Window{
    public:
    	Window();
    	void ListenToClients(Server server);
    };
     
    void Window::ListenToClients(Server server)
    {
        for(int i = 0; i < 100; i++)
        {
            server.ListenNewConnections();
        }
    }
     
    Window::Window()
    {
    	Server myServer;
    	std::thread serverThread(&Window::ListenToClients, this, myServer);
    }
     
    int _tmain(int argc, _TCHAR* argv[])
    {
        Window wiwi;
        return 0;
    }
    A l'ex�cution, c'est plus "funky", en mode Debug, car le runtime qui appelle le destructeur de serverThread � la sortie de "Window::Window()", il a rep�r� que le thread n'a pas �t� "join�" et t'envoie bouler comme un gros sale que je suis.

    C'est donc une "propri�t�" de vos classes Serveur ou Window ou de leurs anc�tres qui emp�che la compilation, ou une diff�rence d'impl�mentation de std::thread.

  11. #11
    Membre actif
    Homme Profil pro
    �tudiant
    Inscrit en
    Ao�t 2016
    Messages
    20
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2016
    Messages : 20
    Par d�faut
    Merci pour ton aide, j'ai trouver une solution
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #include "window.h"
     
    Window::Window(): QWidget()
    {
        setFixedSize(600, 400);
     
        m_start = new QPushButton("Start Server");
        m_shut  = new QPushButton("Shut Down");
        QTextEdit *log = new QTextEdit;
     
        log->setReadOnly(true);
        log->setFont(QFont("Courier"));
        log->setLineWrapMode(QTextEdit::NoWrap);
     
        QHBoxLayout *footer = new QHBoxLayout();
        footer->addWidget(m_start);
        footer->addWidget(m_shut);
     
        QGridLayout *window = new QGridLayout();
        window->addWidget(log, 0, 1);
        window->addLayout(footer, 1, 0, 1, 2);
     
        setLayout(window);
     
        QObject::connect(m_start, SIGNAL(clicked()), this, SLOT(Config()));
        QObject::connect(m_shut, SIGNAL(clicked()), this, SLOT(close()));
     
        Server myServer(1111);
        std::thread serverThread([this, &myServer]()
        {
          Window::ListenToClients(myServer);
        });
     
    }
     
    void Window::Config()
    {
        config.exec();
    }
     
    void Window::ListenToClients(Server &myServer)
    {
        for(int i = 0; i < 100; i++)
        {
            myServer.ListenNewConnections();
        }
    }
    En revanche le programme crash a l'execution. Apparemment quelque chose ne va pas avec
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    std::thread serverThread([this, &myServer]()
        {
          Window::ListenToClients(myServer);
        });

  12. #12
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 503
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 503
    Par d�faut
    Passage par expression lambda, pourquoi pas.

    Mais le probl�me indiqu� au runtime reste le m�me.
    Ton destructeur de "std::thread" va �tre appel� � la fin de "Window::Window(): QWidget()", comme dans mon code.
    Les "std::thread", c'est comme les autres objets en C++, c'est � nous de g�rer leur cycle de vie et leur "ownership".

  13. #13
    Membre chevronn�

    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mars 2015
    Messages
    294
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 294
    Par d�faut
    Bonjour tu aurais pu aussi utiliser une classe derivant de QThread pour ton thread ou un QThread et un objet derivant de QObject(une des deux manieres de faire du multithreading avec Qt)....

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Error 5133 lors de cr�ation de base
    Par JLDESIR dans le forum MS SQL Server
    R�ponses: 2
    Dernier message: 13/09/2011, 10h03
  2. Error LNK2005 lors de l'utilisation d'une classe
    Par sapin dans le forum D�buter
    R�ponses: 6
    Dernier message: 22/04/2009, 10h36
  3. R�ponses: 10
    Dernier message: 13/11/2007, 13h04
  4. error C2664: 'SetConsoleTitleW'
    Par pi-2r dans le forum C
    R�ponses: 3
    Dernier message: 27/08/2007, 10h38
  5. R�ponses: 6
    Dernier message: 16/06/2006, 09h14

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