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 :
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...
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); } [...] };
Où me serais-je trompé ?
Merci de votre aide.
Partager