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

Windows Forms Discussion :

Evénement DLL->Appli en C#


Sujet :

Windows Forms

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Evénement DLL->Appli en C#
    Bonjour,

    Je ne suis pas un expert du dév sous Windows. Je développe quasi exclusivement en C sur µC.

    Ajourd'hui je travaille sur une application qui utilise d'une DLL (créée par mes soins en C#) .

    * La DLL écoute un port TCP est interprète les données recue.
    * Lorsque qu'une certaine trame est identifié la DLL génère un évenement.
    * L'application (Dév en C# également) récupère cette évement est affiche un message dans un label.

    Voici la difficulté que je rencontre:
    La DLL lorsqu'elle génère un événement, en réalité va juste executer la fonction de l'application qui intercepte l'événement.
    Donc la DLL me génère une exeption comme quoi le label dasn lequel j'essaye d'écrire n'est pas déclaré dans son thread.

    Pour moi windows fonctionnait de la facon suivante:
    Une application ou une DLL génère un événement est ensuite toutes les application lancé étant a l'ecoute de cet événement font éxécuter une fonction. (sans aucun lien avec le générateur de l'événement)

    Pourriez vous me diriger vers une explication de ce type d'événement (asynchrone) ou vers un exemple ?

    Cordialement,
    Gaétan

  2. #2
    Membre habitué Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Points : 174
    Points
    174
    Par défaut
    salut...
    Ce que je ne comprend pas c'est qu'une DLL n'est pas assimilé a un thread...donc ce type d'erreur est bizarre je ne vois pas pourquoi ta DLL ne peut pas appeler une fonction de ton appli et que cette appli écrit dans ce label....
    Sinon je t'aurai dit de faire un delegate...

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Lors de la connectiona la Dll, je crée un thread qui s'occupe de lire le socket et d'analyser la données.
    C'est ce thread qui génère l'événement.
    L'événement est ensuite récupéré par une fonction de l'appli qui essaye d'écrire dans un label.
    A ce moment la Dll me génére une excemption "Le contrôle control lab a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé"

    Merci

  4. #4
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Si tu utilises plusieurs thread, il faut savoir que seul le thread principal peut modifier les contrôles graphiques (tout les objets qui héritent de Control il me semble), c'est la raison de ton message d'erreur.

    Il faut que tu passes par l'invoke pour modifier ton label. L'invoke sert à effectuer un traitement par le thread principal et donc de permettre la modification de contrôles depuis un autre thread. Utilises quelque chose dans ce style pour modifier ton label suite à l'événement déclenché par ta DLL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    delegate void SetLabelCallBack(string text);
    public void SetLabel(string text)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new SetLabelCallBack(SetLabel), text);
        } 
        else
        {
            this.monLabel.Text = text;
        }
    }

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    C'est extrèmement lourd !

    Vu qu'a terme je risue d'utilisé une bonne part des contrôles graphique de la Form !

    Sur les net j'ai trouvé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Control.CheckForIllegalCrossThreadCalls = false;
    D'après ce que j'ai lu ca permet de repasser en compatibilité VS2003, qui autorisait ce type d'action...

    Je test....

    Merci,

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Merci de votre aide...

    Finalement, le résultat obtenue avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Control.CheckForIllegalCrossThreadCalls = false;
    me convient.

    Gaétan

  7. #7
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    C'est uniquement valable en debug ce type de choses, il suffit de lire la MSDN

    Gets or sets a value indicating whether to catch calls on the wrong thread that access a control's Handle property when an application is being debugged.
    Passe par l'invoke, c'est la seule manière de procéder

Discussions similaires

  1. FileLoadException Dll C++ / Appli C#
    Par snoups58 dans le forum Windows Forms
    Réponses: 19
    Dernier message: 28/07/2010, 16h43
  2. Réponses: 1
    Dernier message: 20/08/2009, 19h29
  3. Réponses: 6
    Dernier message: 20/10/2005, 21h36
  4. passage de pointeurs entre appli delphi et DLL c++
    Par e-teo dans le forum Langage
    Réponses: 1
    Dernier message: 13/10/2005, 21h46
  5. [Appli][Autre language]dll-contenant form
    Par flash dans le forum Langage
    Réponses: 6
    Dernier message: 20/09/2002, 14h18

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