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 :

events & delegates


Sujet :

C++/CLI

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    �tudiant
    Inscrit en
    F�vrier 2006
    Messages
    3
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 3
    Par d�faut events & delegates
    Bonjour � tous !

    je d�veloppe actuellement sous Visual C++ .NET (VC2008 orcas b2)
    et je suis confront� a un probl�me quasi-existentiel

    je suis entrain de d�velopper une classe/librairie (dll), qui me permettra (peut �tre un jour),
    d'envoyer des b�tes messages UDP � travers un r�seau...
    l'envoi de paquets UDP s'�ffectue dans une boucle interminable.

    ma question est la suivante :
    est-il possible de d�clancher un evenement lors du passage dans cette boucle,
    pour ensuite, exploiter cet evenement dans un Winform quelconque ?


    si oui, comment ?

    si vous avez besoin de plus de d�tail n'h�sitez pas � me le demander.
    merci d'avance

  2. #2
    Membre Expert
    Avatar de Merlin
    Homme Profil pro
    Conseil - Consultant en syst�mes d'information
    Inscrit en
    Mars 2002
    Messages
    524
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Conseil - Consultant en syst�mes d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 524
    Par d�faut
    la r�ponse est oui. Il suffit que ta classe expose un event.. et que ton code le d�clenche au bon moment.
    D�s lors il n'y a aucune difficult� mais si tu poses la question c'est qu'un truc t'�chappe. Essaye d'expliquer ce qui te fait coincer dans ce m�canisme pour qu'on puisse d'aider.

  3. #3
    Candidat au Club
    Profil pro
    �tudiant
    Inscrit en
    F�vrier 2006
    Messages
    3
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 3
    Par d�faut
    merci pour la r�ponse... et en effet, quelque chose m'�chappe...
    en gros voici mon code :

    c'est donc une librairie C++ Managed (cli) qui a pour but d'�mettre des datagrammes UDP (Namespace : LANcrawler ; Classe : Publisher)
    ps : la source a �t� r�duite, possibilit� d'erreurs...

    LANcrawler.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
     using namespace System;
     using namespace System::Net;
     using namespace System::Net::Sockets;
     using namespace System::Threading;
    
    namespace LANcrawler 
    {
        public ref class Publisher
        {
        private:
            array<Byte>^    _DatagramArray;
            IPAddress^      _ServerIP;
            int             _ServerPort;
            IPEndPoint^     _IPEndPoint;
    
            Sockets::Socket^ _UDPsocket;
            Thread^          _FloodingThread;
            void Flood();
            
        public:
            Publisher(String^ _Datagram, String^ _IP, int _Port);
             void Start();
        };
    }
    LANcrawler.cpp

    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
    #include "stdafx.h"
    #include "LANcrawler.h"
    
    // Constructor
    LANcrawler::Publisher::Publisher(String^ _Datagram, String^ _IP, int _Port)
    {
    
        this->_ServerIP = Net::IPAddress::Parse(_IP); // Local IP
        this->_ServerPort = _Port; // Local Port
        this->_DatagramArray = Text::Encoding::ASCII->GetBytes(_Datagram); // Datagram to send
    
        this->_IPEndPoint = gcnew Net::IPEndPoint(this->_ServerIP, this->_ServerPort); // Building IP end Point Object
        this->_UDPsocket = gcnew Socket(AddressFamily::InterNetwork, SocketType::Dgram, ProtocolType::Udp); // Building UDP socket object
    }
    
    // Start method
    // <- this method start the "flooding thread" ->
    void LANcrawler::Publisher::Start()
    {
        if (this->_FloodingThread == nullptr)
        {
            this->_FloodingThread = gcnew Thread(gcnew ThreadStart(this, &Publisher::Flood));
            this->_FloodingThread->Start(); // Start thread on flood method
        }
     }
    
    // Flooding method [threaded]
    void LANcrawler::Publisher::Flood()
    {
        while(true)
        {
              this->_UDPsocket->SendTo(this->_DatagramArray, this->_IPEndPoint);
              Threading::Thread::Sleep(50);
              // publier ici un evenement !
        }
    }
    l'id�al serait donc, dans la boucle de la fonction flood de "publier" un evenement que je pourrais donc traiter dans n'importe quel winform ou application console...
    (par exemple afficher le nombre de datagrammes envoy�s, dans un label sur un winform)

    j'ai pas encore trouv� la logique
    merci beaucoup

  4. #4
    Membre confirm�
    Inscrit en
    Juillet 2004
    Messages
    72
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 72
    Par d�faut event delegate
    Alors dans un premier temps tu d�clare un d�l�gate

    ex en C# :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    public void MessageAEnvoyerCallback (String msg);
    puis tu d�clare un attribut event :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    public event MessageAEnvoyerCallback EvennementMessage;
    et dans ta fonction tu l'appel ainsi :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    if(EvennementMessage != null)
    EvennementMessage("message");
    Dans ta form tu auras un truc du genre
    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
     
    private Publisher m_publisher = new Publisher();
     
    Form()
    {
    m_publisher.EvennementMessage += new MessageAEnvoyerCallback(publisher_EvennementMessage );
    }
     
    private void publisher_EvennementMessage (String msg)
    {
    if(this.InvokeRequired)
    {
    this.Invoke(new InvokeHandler(delegate()
                        {
                            publisher_EvennementMessage(msg);
                        }));
    }
    else
    {
    textebox1.Text = msg;
    }
    }

  5. #5
    Membre Expert
    Avatar de Merlin
    Homme Profil pro
    Conseil - Consultant en syst�mes d'information
    Inscrit en
    Mars 2002
    Messages
    524
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Conseil - Consultant en syst�mes d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 524
    Par d�faut
    Pour compl�ter cette r�ponse, j'ajouterais qu'un event expose un delegate qui poss�de deux arguments, le sender de type object et "e" un objet EventArgs.
    Depuis .NET 2.0 on ne d�clare plus un delegate pour un event de la fa�on montr�e dans le code du post pr�c�dent. On utilise en effet les delegate g�n�riques en partant du type de l'argument de l'event.

    Exemple :

    La classe argument d'�v�nement :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class MyEventArgs : EventArgs
    {
        private string msg;
    
        public MyEventArgs( string messageData ) {
            msg = messageData;
        }
        public string Message { 
            get { return msg; } 
            set { msg = value; }
        }
    }
    L'�v�nement se d�clare alors comme suit, sans passer par la d�finition d'un delegate :

    (ici la classe qui expose et lance l'�v�nement)

    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
    public class HasEvent
    {
    // Declare an event of delegate type EventHandler of 
    // MyEventArgs.
    
        public event EventHandler<MyEventArgs> SampleEvent;
    
        public void DemoEvent(string val)
        {
        // Copy to a temporary variable to be thread-safe.
            EventHandler<MyEventArgs> temp = SampleEvent;
            if (temp != null)
                temp(this, new MyEventArgs(val));
        }
    }
    J'ajouterais qu'on �vite dans un code bien �crit de lancer les �v�nements dans les traitements. On pr�f�re cr�er une m�thode "DoMachin" qui elle teste si le gestionnaire est aliment� (non nul), qui cr��e l'instance des arguments et qui lance r�ellement l'�v�ment.
    Cela permet une meilleure r�utilisation du code, puisque si l'�v�nement doit �tre d�clencher � 2 endroits ou plus on ne fait qu'appeller le DoMachin.
    Cette derni�re peut avoir des arguments, par exemple "DoEtatChang�(bool enMarche); qui pourra �tre appel�e DoEtatChang�(true) ou DoEtatChang�(false), par exemple � l'entr�e et � la sortie d'une m�thode qui modifie l'�tat de l'objet.

    Tu peux aussi regarder la page MSDN suivante qui donne un exemple de delegate generique (dont sont puis�s les bouts de code ci dessus):

    http://msdn2.microsoft.com/en-us/library/db0etb8x.aspx

  6. #6
    Candidat au Club
    Profil pro
    �tudiant
    Inscrit en
    F�vrier 2006
    Messages
    3
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 3
    Par d�faut
    Merci pour tout, j'ai pris bonne note et... �a marche
    max

Discussions similaires

  1. DLL TCP Asynchrone et delegate/event
    Par marso dans le forum C#
    R�ponses: 1
    Dernier message: 03/09/2008, 19h05
  2. Polymorphism - Delegates & Events
    Par ragnarokr dans le forum D�buter
    R�ponses: 6
    Dernier message: 16/06/2008, 16h38
  3. events & delegates
    Par simaxe25 dans le forum G�n�ral Dotnet
    R�ponses: 4
    Dernier message: 17/10/2007, 18h01
  4. Event et Delegate
    Par kreitech dans le forum Windows Forms
    R�ponses: 2
    Dernier message: 16/02/2007, 13h54
  5. [C#]Thread, event/delegate et Form
    Par doccpu dans le forum Windows Forms
    R�ponses: 28
    Dernier message: 01/08/2005, 18h35

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