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 :

Native, Managed et Threads


Sujet :

C++/CLI

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 11
    Par défaut 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 : 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
     
    };
    }
    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
     
    #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.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu devrais peut-être plutôt poster dans le sous-forum C++/CLI, ils en savent un peu plus là-dessus...

    PS: Ta classe native, est-elle quand même en code managée, ou bien est-elle carrément en code natif?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 11
    Par défaut
    Pour ton PS, c'est du natif pur (uniquement le ClasseC.h), du C++ normalisé en d'autres termes.

    On va me dire : "Oui mais pourquoi alors y a t'il un #incude windows.h dans le code natif ?"

    Il faut bien comprendre que ce code est une miniature (puissance 10) de mon projet où je dois afficher à l'écran des trames d'un bus CAN. Pour relier le PC au bus CAN, j'utilise un boîtier fourni avec une DLL et un .h

    Et dans la DLL, j'ai une fonction bloquante que j'ai remplacée dans mon code par WaitForSingleObject (histoire d'attendre un peu)

    J'espère avoir répondu à tes questions...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 38
    Par défaut
    Tu utilises quoi comme interface, IXXAT ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 11
    Par défaut
    Non, j'utilise un boitier CANCase mais je ne crois pas que cet indice vas t'aider pour autant.

    Si tu as un exemple avec un "delegate" qui marche je suis preneur.
    Toute la difficulté est d'associer une fonction managée à un évènement qui se produit dans un thread côté natif.

    Encore merci

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    En natif, le plus simple, c'est SendMessage() vers une fenêtre ou un contrôle natif.
    Mais avec les WinForms, ça se complique...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 38
    Par défaut
    Citation Envoyé par Kuro_Tsuki Voir le message
    Non, j'utilise un boitier CANCase mais je ne crois pas que cet indice vas t'aider pour autant.

    Si tu as un exemple avec un "delegate" qui marche je suis preneur.
    Toute la difficulté est d'associer une fonction managée à un évènement qui se produit dans un thread côté natif.

    Encore merci
    Non, je disais ça parce que j'en ai déjà fait ce genre de choses pour l'USB-to-CAN d'IXXAT. Mais je crois qu'eux fournissaient une dll .net. Je vais essayer de retrouver ça.

    Edit : Je viens de regarder Vector aussi fournissent un driver .net. Ca ne te convient pas ?

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/10/2011, 14h34
  2. unable to create new native thread
    Par jeha dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 31/05/2010, 09h28
  3. Réponses: 2
    Dernier message: 25/02/2010, 15h52
  4. Réponses: 1
    Dernier message: 26/02/2008, 12h54
  5. Utilisation d'une dll native par une toolbar managée
    Par didierll dans le forum C++/CLI
    Réponses: 1
    Dernier message: 10/07/2007, 07h56

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