Native, Managed et Threads
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
Code:
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
};
} |
ClasseC/ClasseC.h
Code:
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_ */ |
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.
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.