Bonsoir,
J'ai longtemps hésité avant de poster.
Je ne suis pas du genre à me plaindre ("J'y arrive pas, aidez moi !") mais un peu d'aide ne serait pas de trop...
Avant de poser mon poser mon problème, je précise que j'utilise Visual Studio 2005 pour un projet Windows Form.
J'ai une partie de mon code qui est du C++ classique ('Native') et le retse, une IHM Windows Form ('Managed').
Dans le code 'native', j'ai un thread qui tourne.
Mon but est d'appeller une fonction de l'IHM (pour mettre à jour du texte par exemple) depuis le thread.
Mon code est simple :
Form1.h
ClasseC/ClasseC.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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 #pragma once #include "ClasseC\ClasseC.h" namespace IHM_Test { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); maClasse = new ClasseC(); } int toto() { blabla->Text = maClasse->DonnerA().ToString(); return 0; } protected: static ClasseC * maClasse; ~Form1() { if (components) { delete components; } delete maClasse; } private: System::ComponentModel::Container ^components; System::Windows::Forms::TextBox^ blabla; #pragma region Windows Form Designer generated code void InitializeComponent(void) { this->blabla = (gcnew System::Windows::Forms::TextBox()); this->SuspendLayout(); // // blabla // this->blabla->Location = System::Drawing::Point(22, 21); this->blabla->Name = L"blabla"; this->blabla->Size = System::Drawing::Size(95, 20); this->blabla->TabIndex = 1; // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(156, 62); this->Controls->Add(this->blabla); this->Name = L"Form1"; this->Text = L"Form1"; this->ResumeLayout(false); this->PerformLayout(); } #pragma endregion }; }
Je me suis penché sur la notion d'évènement (avec _event, _hook _unhook..) puis j'ai essayé les 'delegate' et j'ai même tenté un 'gcroot' pour que ClasseC soit 'managed' sans parler des #pragma managed et #pragma unmanaged qui n'ont pas fait grand chose.
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 #ifndef CLASSEC_H_ #define CLASSEC_H_ // includes #include "windows.h" class ClasseC { public: ~ClasseC() {} ClasseC() { a=0; CreateThread(0, 0x1000, ClasseC::RxThread, (LPVOID) 0, 0, NULL); } int DonnerA() { return a; } protected: static int a; static HANDLE test; static DWORD WINAPI RxThread( void* par ) { while( a < 100 ) { WaitForSingleObject(test,1000); a += 10; //Appeller IHM_Test::toto() et ainsi afficher a dans l'IHM } return 0; } }; int ClasseC::a; HANDLE ClasseC::test; #endif /* CANCASE_H_ */
Alors soit je suis pas tombé sur les bon exemples, soit je ne suis pas "doué" mais toujours est il que je ne suis arrivé à rien.
Si quelqu'un avait ne serait-ce qu'une piste pour m'éclairer ...
Je lui en serait très très reconnaissant.
Ah et si je poste au mauvais endroit, je m'excuse par avance.
Partager