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

VC++ .NET Discussion :

creer un nouvel événement


Sujet :

VC++ .NET

  1. #1
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut creer un nouvel événement
    Salut,


    je cherche à créer un événement sur une classe c++ de ma création sous visual c++ 2005


    j'ai trouvé des manières de le faire en VB.NET et en C#, mais pas en C++






    EDIT j'ai trouvé cela http://www.microsoft.com/france/msdn...k_default.mspx
    mais j'ai pas compris
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    vraiment personne...


    j'ai trouvé quelques méthodes avec __event et delegate, mais il faut qu'elle passe en compilant avec /clr


    si quelqu'un peut me dire ce que cela implique en pratique sur mon application, ça m'arrangerait aussi
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    salut, que veux-tu faire exactement ?
    en c++/cli, c'est pareil qu'en vb.net ou c#
    il faut utiliser event et delegate, et non les mots clés précédés de __

  4. #4
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    ben je veux créer un composant COM, qui sera utilisé via DCOM par un client en C#, et qui puisse avoir un événement qui sera récupéré par le client
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  5. #5
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    et tu veux faire un assembly .Net que tu vas enregistrer pour COM Interop ? ou bien tu veux le faire "a l'ancienne" ?

  6. #6
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    Citation Envoyé par nico-pyright(c)
    et tu veux faire un assembly .Net que tu vas enregistrer pour COM Interop ? ou bien tu veux le faire "a l'ancienne" ?

    quel est la différence ? les deux peuvent fonctionner via DCOM ?
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  7. #7
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    je suis pas un expert de DCOM, mais à priori oui
    mais bon, si tu as une contrainte à ce que ca passe en /clr, de toutes facons, tu n'as pas le choix
    tu t'en sors avec delegate et event ? à part la syntaxe, c'est la meme chose en VB.NEt et C#

    je m'en suis servi dans un de mes tutos http://nico-pyright.developpez.com/t...ol/#Levenement, c'est cependant très bref comme description, j'espere que ca t'aidera

  8. #8
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    pour le moment, je suis sur la méthode native...

    j'ai fini par obtenir ce source, qui marche

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    #include <iostream>
    #include <string>
     
    using namespace std;
     
    [event_source(native)]
    class Test
    {
    // attributs
    protected:
    	char* ref;
     
    // constructeurs et destructeurs
    public: 
    	Test();
    	~Test();
     
    // accesseurs
    public:
    	void setRef(char* str);
     
    // evenements
    public:
    	__event void refChange(char* msg);
    };
     
    Test::Test() 
    {
    	ref = NULL;
    }
     
    Test::~Test() 
    {
    	if (ref != NULL)
    		free(ref);
    }
     
    void Test::setRef(char* str)
    {
    	if (ref != NULL)
    		free(ref);
     
    	if (str != NULL)
    	{
    		ref = (char*) malloc((1+strlen(str))*sizeof(char));
    		strcpy(ref,str);
    	}
     
    	this->refChange(ref);
    }
     
    [event_receiver(native)]
    class Receiv
    {
    public:
    	Receiv();
    	~Receiv();
     
    public:
    	void hookEvent(Test* pTest);
    	void unhookEvent(Test* pTest);
     
    public:
    	void OnRefChange(char* str);
    };
     
    Receiv::Receiv() {}
    Receiv::~Receiv() {}
     
    void Receiv::OnRefChange(char* str)
    {
    	cout << "nouvel événement:\t" << str << endl;
    }
     
    void Receiv::hookEvent(Test* pTest)
    {
    	__hook(&Test::refChange, pTest, &Receiv::OnRefChange);
    }
     
    void Receiv::unhookEvent(Test* pTest)
    {
    	__unhook(&Test::refChange, pTest, &Receiv::OnRefChange);
    }
     
     
    int main(int argc, char* argv[])
    {
    	Test* myTest = new Test();
    	Receiv* myReceiv = new Receiv();
     
    	myTest->setRef("coucou 1");
    	myReceiv->hookEvent(myTest);
    	myTest->setRef("coucou 2");
    	myReceiv->unhookEvent(myTest);
    	myTest->setRef("coucou 3");
     
    	delete myTest;
    	return 0;
    }

    si vous avez des remarques... ça peut m'aider
    (c'est moche et tout tient dans un fichier... mais c'est volontaire pour faciliter l'affichage)
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  9. #9
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    t'as pas dit que tu voulais un truc managé ? (avec /clr)

  10. #10
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    Citation Envoyé par nico-pyright(c)
    t'as pas dit que tu voulais un truc managé ? (avec /clr)

    si si... mais ça compile avec /clr


    j'ai mis cette méthode là, car j'ai réussi à la faire marcher. Je touche à la seconde maintenant... c'était juste pour partager une source-test avec les utilisateurs qui seraient intéressés
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  11. #11
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    Citation Envoyé par gorgonite
    c'était juste pour partager une source-test avec les utilisateurs qui seraient intéressés
    merci

  12. #12
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    version managée...

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    #include <stdlib.h>
    #include <string>
     
    using namespace System;
     
    delegate void RefChangeHandler(String^ str);
     
    ref class ManagedSrc
    {
    // attributs
    protected:
    	char* ref;
     
    // constructeurs et destructeurs
    public: 
    	ManagedSrc();
    	~ManagedSrc();
     
    // accesseurs
    public:
    	void setRef(char* str);
     
    // evenements
    public:
    	event RefChangeHandler^ OnRefChange;
    };
     
    ManagedSrc::ManagedSrc() 
    {
    	ref = NULL;
    };
     
    ManagedSrc::~ManagedSrc() 
    {
    	if (ref != NULL)
    		free(ref);
    };
     
    void ManagedSrc::setRef(char* str)
    {
    	if (ref != NULL)
    		free(ref);
     
    	if (str != NULL)
    	{
    		ref = (char*) malloc((1+strlen(str))*sizeof(char));
    		strcpy(ref,str);
    	}
     
    	OnRefChange(gcnew String(str));
    }
     
    ref class ManagedReceiv
    {
    public:
    	void OnRefChange(String^ str);
    };
     
    void ManagedReceiv::OnRefChange(String^ str)
    {
    	Console::WriteLine("nouvel evenement:\t{0}", str);
    }
     
    void managedEvent()
    {
    	ManagedSrc ^ mySrc = gcnew ManagedSrc();
    	ManagedReceiv^ myReceiv = gcnew ManagedReceiv();
     
    	mySrc->setRef("coucou 1");
     
    	// hook handler to event
    	mySrc->OnRefChange += gcnew RefChangeHandler(myReceiv, &ManagedReceiv::OnRefChange);
     
    	mySrc->setRef("coucou 2");
     
    	// unhook handler to event
    	mySrc->OnRefChange -= gcnew RefChangeHandler(myReceiv, &ManagedReceiv::OnRefChange);
     
    	mySrc->setRef("coucou 3");
    }
     
    int main(int argc, char* argv[])
    {
    	managedEvent();
     
    	return 0;
    }
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  13. #13
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    aie aie aie ... utiliser des char * dans un projet managé

  14. #14
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    Citation Envoyé par nico-pyright(c)
    aie aie aie ... utiliser des char * dans un projet managé


    ça pose des problèmes, ou c'est juste que les string sont plus fréquemment utilisées ?
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  15. #15
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    disons que ca produit du code non vérifiable, non secure. Comme dirait quelqu'un que je connais, les char *, c'est mal
    non, mais du moment que tu sais ce que tu fais, y a pas de soucis, c'est fait aussi pour ca

  16. #16
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 24
    Par défaut
    Merci beaucoup pour ces exemples de gestion d'événements.

    Etant débutant avec la programmation VC++ (.NET 2003), j'ai été très surpris que l'envoi d'événement soit synchrone.

    Par exemple, j'ai 2 threads Sender et Receiver, avec Sender qui envoie des événements RefChange à Receiver. Si la méthode Receiver::OnRefChange() s'exécute en 1 seconde (simulé par un Sleep(1000)), alors le thread Sender est bloqué lui aussi 1 seconde à chaque envoi d'événement!

    Comment faire pour générer des envois d'événements de façon non bloquante?

Discussions similaires

  1. Réponses: 5
    Dernier message: 16/06/2006, 21h16
  2. creer une nouvelle base dans oracle 10g
    Par clement42 dans le forum Oracle
    Réponses: 4
    Dernier message: 02/05/2006, 18h20
  3. creer une nouvelle fenetre dans un fork
    Par christo_lr dans le forum POSIX
    Réponses: 2
    Dernier message: 24/04/2006, 14h13
  4. Creer une nouvelle Child Frame
    Par Andrenn dans le forum MFC
    Réponses: 2
    Dernier message: 14/02/2005, 12h47
  5. Creer une nouvelle référence pour le driver ODBC
    Par tripper.dim dans le forum Connexion aux bases de données
    Réponses: 3
    Dernier message: 04/01/2005, 22h57

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