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 :

Lancer un event sans le conna�tre


Sujet :

C++/CLI

  1. #1
    Membre � l'essai
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Octobre 2011
    Messages
    5
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 5
    Par d�faut Lancer un event sans le conna�tre
    Bonjour � toutes et tous

    Je suis en train de faire un composant WPF (un poil de C# et beaucoup de C++/CLI) qui encapsule des librairie C++.

    Cot� C++, nous avons un syst�me de notification interne bas� sur des callbacks. Je voudrais que ces notifications soient accessibles dans l'interface via l'envoi d'event manag� classique (le but est que les utilisateurs du composant ne voient pas le code non manag�)

    Sauf que j'aimerais �viter d'�crire un m�canisme g�n�rique auquel on file le type de notification, la classe d'argument de l'event CLI et qu'il transforme l'un en l'autre tout seul. Et je bloque sur deux points :
    - Pas le droit aux pointeurs de fonction sur une classe manag�e
    - Pas possible de d�clar� un event depuis une classe non manag�

    J'�tais donc parti sur une classe template mais je n'arrive pas a utiliser un type d'event et/ou delegate en param�tre de template ... (ce qui me semble logique)
    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
     
    public ref class CkstClrKineoControl : public System::Windows::Controls::Control
    {
    public:
    	delegate void SelectionDidChangeDelegate(CkstClrNotificationSelection^ i_selection);
    	SelectionDidChangeDelegate^ SelectionDidChangeEvent;
    	event SelectionDidChangeDelegate^ SelectionDidChangeEventHandler
    	{...} // add, remove & raise
     
    private:
    	CkstClrNotificator<CkstClrNotificationSelection, SelectionDidChangeDelegate>* m_notificator;
    }
     
    CkstClrKineoControl::CkstClrKineoControl()
    {
    	m_notificator = new CkstClrNotificator <CkstClrNotificationSelection, SelectionDidChangeDelegate> (CkitNotificator::defaultNotificator(), CkppSelection::DID_CHANGE, SelectionDidChangeEvent);
    }
    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
     
    template < typename clrNotificationClass, typename eventClass >
    class CkstClrNotificator
    {
    public:
     
    	inline CkstClrNotificator(const CkitNotificatorShPtr& i_notificator, CkitNotification::TType i_type, eventClass^ i_event):
    		m_type(i_type),
    		m_event(i_event)
    	{
    		i_notificator->subscribe< CkstClrNotificator >(m_type, this, &CkstClrNotificator::notificationReciever);
    	}
     
    	inline virtual ~CkstClrNotificator()
    	{
    		CkitNotificator::defaultNotificator()->unsubscribe(m_type, this);
    	}
     
    	inline void notificationReciever(const CkitNotificationConstShPtr& i_notification)
    	{
    		CkstClrNotificationSelection^ clrSelection = gcnew clrNotificationClass(i_notification);
    		m_event->Invoke(clrSelection);
    	}
     
    private:
    	CkitNotification::TType m_type;
    	gcroot<eventClass^> m_event;
    };
    Bon �a marche pas, mais c'est le seul truc que j'arrive � faire compiler

    Donc je cherche soit a corriger cette m�thode, soit une autre m�thode ou je pourrais transformer mes notifications en event manag� sans avoir a �crire une classe sp�cifique non manag� et une fonction manag� sp�cifique pour faire envoy� l'event, ceci par type de notification a envoyer

  2. #2
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 505
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 505
    Par d�faut
    Je ne comprends pas tous � votre question.

    Vous m�langez le probl�me et votre solution.

    Pouvez-vous �tre plus pr�cis sur le probl�me initial ?

    - Pas le droit aux pointeurs de fonction sur une classe manag�e
    Je suis tr�s circonspect sur cette assertion.

    De plus un Event n'est qu'un multicast delegate habill�.

    Et avoir un pointeur sur un delegate c'est tout � fait possible :
    GetFunctionPointerForDelegate( http://msdn.microsoft.com/fr-fr/libr...rdelegate.aspx)

    Voici un exemple d'utilisation.
    http://www.codeguru.com/forum/showthread.php?t=444298

  3. #3
    Membre � l'essai
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Octobre 2011
    Messages
    5
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 5
    Par d�faut
    Merci de votre r�ponse. J'avais m�lang� un peu de ma solution pour essayer d'expliquer ce que je voulais.

    Le but ultime est de branch� des callback non manag� sur des events, en un minimum de code.

    J'ai effectivement trouv� et utiliser le GetFunctionPointerForDelegate depusi mon dernier message (j'ai commenc� le C++/CLI il y a 3 semaines ) mais ce n'est pas encore satisfaisant, parce que j'utilise un event classique (d�finition du delegu� et de l'event), et une callback pour lancer l'event (donc une d�finition de d�l�gu�, un delegu� et la fonction � appeler).
    Je voudrais �viter d'avoir � faire le second point vu que �a fait toujours la m�me chose, �a devrait pouvoir �tre �crit une fois pour toute et pas � chaque event

    Ma callback actuellement fait cela :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    void CkstClrKineoControl::fireSelectionDidChange(const CkitNotificationConstShPtr& i_selection)
    {
    	CkstClrNotificationSelection^ clrNotification = gcnew CkstClrNotificationSelection(i_selection);
    	SelectionDidChangeEvent(clrNotification);
    };
    Ou
    - CkitNotificationConstShPtr est ma notification c++
    - CkstClrNotificationSelection est mon EventArgs de l'event SelectionDidChangeEvent

    Id�alement �a devrait pouvoir se faire sous forme template avec en param�tre :
    - La classe de l'EventArgs (qui prends toujours en constructeur un CkitNotificationConstShPtr)
    - L'event � envoyer

    Je n'arrive pas � lancer directement l'event depuis le code C++ non manag�
    Et je n'arrive pas non plus � appeler un delegate qui prends en param�tre une classe manag�e (erreur � l�ex�cution)
    Par contre un d�l�gu� qui prends un void* que je cast �a marche

    Bref, j'ai loup� un truc sur le mixe Template + Event

  4. #4
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 505
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 505
    Par d�faut
    Je ne vois toujours pas clairement le probl�me. D�sol�.

    Mais voici un exemple d'appel d'un delegate depuis du code natif.
    http://tigerang.blogspot.com/2008/09...e-pinvoke.html

  5. #5
    Membre � l'essai
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Octobre 2011
    Messages
    5
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 5
    Par d�faut
    Citation Envoy� par bacelar Voir le message
    Je ne vois toujours pas clairement le probl�me. D�sol�.

    Mais voici un exemple d'appel d'un delegate depuis du code natif.
    http://tigerang.blogspot.com/2008/09...e-pinvoke.html
    Ton exemple, comme les autres que j'ai trouv�, indique comment appel� un delegate qui prends en argument du code non manag�. Hors les events que j'envois contiennent un param�tre manag� (c'est l'exemple que je met dans le premier post). J'ai un crash � l'ex�cution dans ce cas, au moment de la transition native->manag� (que je n'ai pas avec la callback interm�diaire qui r�cup�re du non manag� et active l'event manag�)

    Bref en plus condens� :
    D�j� les d�finitions que j'utilise
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	// SelectionDidChangeDelegate Event
    	delegate void SelectionDidChangeDelegate(CkstClrNotificationSelection^ i_selection);
    	event SelectionDidChangeDelegate^ SelectionDidChangeEvent;
     
    	// SelectionDidChangeDelegate Launcher
    	delegate void FireSelectionDidChangeDelegate(const CkitNotificationConstShPtr& i_selection);
    	void fireSelectionDidChange(const CkitNotificationConstShPtr& i_selection);
    	FireSelectionDidChangeDelegate^								m_SelectionDidChangeDelegate;
    Quand je fais mon delegu� sur ma callback interm�diaire j'utilise ce code :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    	m_SelectionDidChangeDelegate = gcnew FireSelectionDidChangeDelegate(this, &CkstClrKineoControl::fireSelectionDidChange);
    	System::IntPtr functor = System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(m_SelectionDidChangeDelegate);
    	m_notificator = new CkstNotificator(CkitNotificator::defaultNotificator(), CkppSelection::DID_CHANGE, functor.ToPointer());
    (CkstNotificator appelle functor.ToPointer() quand il re�oit l'event interne DID_CHANGE)

    Comment passer directement l'event plut�t qu'une callback ?
    Je n'arrive pas/ne sais pas � acc�der � "l'objet" Event � part ce que j'avais fait dans mon premier post, mais qui crash (et l'appel direct � Invoke me para�t bizarre)

  6. #6
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 505
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 505
    Par d�faut
    Citation Envoy� par AMoreau_Kineo Voir le message
    Ton exemple, comme les autres que j'ai trouv�, indique comment appel� un delegate qui prends en argument du code non manag�. Hors les events que j'envois contiennent un param�tre manag� (c'est l'exemple que je met dans le premier post). J'ai un crash � l'ex�cution dans ce cas, au moment de la transition native->manag� (que je n'ai pas avec la callback interm�diaire qui r�cup�re du non manag� et active l'event manag�)
    L'eventArg est manag� mais rempli dans du code natif.
    The EventData is a data structure that shares the same binary layout as the one that will be created and marshaled from the native code.
    Avez-vous lu attentivement l'exemple ?

  7. #7
    Membre � l'essai
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Octobre 2011
    Messages
    5
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 5
    Par d�faut
    J'ai impl�menter l'exemple, �a marche

    Ca marche m�me quand je rajoute un gcroot<CkstClrNotificationSelection^> dans la struct

    Sauf que je n'arrive pas a remplacer la struct par le gcroot<CkstClrNotificationSelection^> directement, Ca compile Mais � l'appel de fonction j'ai l'erreur suivante :

    Une exception non g�r�e du type 'System.Runtime.InteropServices.COMException' s'est produite dans Module inconnu.

    Informations suppl�mentaires*: Erreur non sp�cifi�e (Exception de HRESULT : 0x80004005 (E_FAIL))
    C'est en �a que je disais que j'ai trouv� des exemples passant des arguments non manag� (parce que dans l'exemple, on utilise une struct non manag�, c'est cot� manag� qu'on sp�cifie les param�tres d'alignement m�moire pour que �a passe)

  8. #8
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 505
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 505
    Par d�faut
    Je pense que votre probl�me est li� au fait que vous utilisez une r�f�rence d'objet manag� comme un pointeur natif nu. Dans ce cas de figure, vous �tes oblig� "d'�pingler" la r�f�rence pour qu'elle ne bouge plus en m�moire.

    http://www.dotnetmonster.com/Uwe/For...ng-a-bridge-or

    Pourquoi ne pas passer par une structure contenant une r�f�rence manag�e ?Cela permet de ne pas "g�rer" cet "�pinglage".

  9. #9
    Membre � l'essai
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Octobre 2011
    Messages
    5
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 5
    Par d�faut
    (Au passage : merci de passer du temps � essayer de r�soudre mon probl�me)

    A priori je ne dois pas avoir de probl�me d'�pingalge, vu que je n'utilise pas de pointeur natif pour d�signer un objet manag�.

    l'event Args est cr�e par le code non-manag� via un gcroot, envoy� � la callback, et oubli�, mais apr�s �tre sorti de la callback.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    	inline void notificationReceiver(const CkitNotificationConstShPtr& i_notification)
    	{
    		gcroot<CkstClrNotificationSelection^> notification = gcnew CkstClrNotificationSelection(i_notification);
    		(*m_delegateFunctor)(notification);
    	}
    Ou alors c'est le delegate qu'il faut pin ?

    Sinon je n'utilise pas la structure parce que cot� C#, il faut que l'event soit "propre" (que le client n'est pas a g�rer une surcouche qui ne lui sert pas). Je pr�f�re �crire ma callback interm�diaire en interne que d'ajouter une couche visible en externe

Discussions similaires

  1. [Syst�me] Lancer un script sans attendre sa fin ?
    Par parisien dans le forum Langage
    R�ponses: 9
    Dernier message: 03/11/2005, 22h09
  2. [Syst�me] Lancer un executable sans attendre la fin
    Par raptor70 dans le forum Langage
    R�ponses: 1
    Dernier message: 27/10/2005, 14h25
  3. Comment lancer une appli sans afficher ses fiches
    Par raoulmania dans le forum Langage
    R�ponses: 5
    Dernier message: 02/09/2005, 18h07
  4. [CR8.5]lancer plusieurs impressions sans utiliser l'ocx
    Par sboober dans le forum SAP Crystal Reports
    R�ponses: 2
    Dernier message: 04/05/2005, 10h08
  5. [MFC]dlg : lancer un dlg sans le montrer
    Par Tsunamis dans le forum MFC
    R�ponses: 10
    Dernier message: 16/06/2004, 10h18

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