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 :

Croisements de threads / Fonctionnement des "delegate"


Sujet :

C++/CLI

  1. #1
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut Croisements de threads / Fonctionnement des "delegate"
    Bonjour,

    Je vais peut-être (re)poser une question fréquemment posée, mais je n'ai pas réussi à trouver une solution dans les forums et les faqs...

    Pour faire simple, j'ai un thread qui va faire des calculs en récoltant les informations sur la GUI (type TextBox, Combox, ...). Ce thread de calcul n'est pas celui qui a généré la GUI. Pour des champs type TextBox, NumericUpDown, je récupére mes données sans soucis. Le problème vient des Combox. Quand je veux récupérer l'item sélectionné, il fait une erreur à l'exécution en prétextant un problème de croisements de threads...

    J'ai donc essayé de résoudre le problème avec des "Delegate" comme conseillé dans les forums/faqs et voici donc mon 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
     
    public ref class Form1 : public System::Windows::Forms::Form {
       // Déclaration des "delegate"
       public : delegate String^ DelegGetStr ();
       public : DelegGetStr ^ delegGS;
     
       // Déclaration de la Combox
       private: System::Windows::Forms::ComboBox^ myCombox;
     
       // Constructeur de la classe
       public : Form1 (void) {
          InitializeComponent ();
          [...]
          delegGS += gcnew DelegGetStr (this, &Form1::ComboxToString);
          }
     
       // Fonction "déléguée" (? - Pas sûr des termes)
       private : String^ ComboxToString () {
          return myCombox->Text;
       }
     
       // Fonction appelée par le thread de calcul pour récupérée le champs de la Combox
       public : String^ Form1::getComboValue () {
          return (String^) this->Invoke (delegGS);
       }
       [...]
    };
    C'est sûrement pas ce qu'il fallait faire, puisque cela ne fonctionne pas... En fait le programme bloque sur "this->Invoke ()". Si je remplace par "BeginInvoke ()" alors la fonction ComboxToString va s'exécuter mais je dois alors faire appel à "EndInvoke" pour récupérer ma valeur, et cette fonction bloque aussi...

    Où me serais-je trompé ?
    Merci de votre aide.

  2. #2
    Membre confirmé Avatar de Thor Tillas
    Inscrit en
    Octobre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 113
    Par défaut
    hello,

    Je suis pas sur de ce que j'avance... mais essaie plutot de faire ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // Fonction appelée par le thread de calcul pour récupérée le champs de la Combox
       public : String^ Form1::getComboValue () {
          return (String^) myCombox->Invoke (delegGS);
       }
    Il me semble que c'est ce que j'utilise et ca passe...

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    Euh, en fait depuis le temps, j'ai contourné le problème et j'évite systématiquement les delegates...
    De toute manière depuis mon message (il y a plus d'un mois et demi!), la faq a été mise à jour, et une rubrique parle de ce problème... http://dotnet.developpez.com/faq/cpp...trolFromThread

    Merci comme même!

  4. #4
    Membre confirmé Avatar de Thor Tillas
    Inscrit en
    Octobre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 113
    Par défaut
    oups... pas vu la date... dsl

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

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