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 à l'essai
    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
    Points : 17
    Points
    17
    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 éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116

  3. #3
    Membre à l'essai
    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
    Points : 17
    Points
    17
    Par défaut
    Désole d'être aussi nul, mais j'y arrive toujours pas :/

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    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 à l'essai
    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
    Points : 17
    Points
    17
    Par défaut
    Il faut l*'argument en referrence? Je comprends pas...

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    Est-ce que la classe "Window" est copy-constructible, ou mouvable ?

  7. #7
    Membre à l'essai
    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
    Points : 17
    Points
    17
    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 éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    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 à l'essai
    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
    Points : 17
    Points
    17
    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 éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    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 à l'essai
    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
    Points : 17
    Points
    17
    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 éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    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 confirmé

    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
    Points : 558
    Points
    558
    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