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

VB.NET Discussion :

Execution dans un autre thread


Sujet :

VB.NET

  1. #1
    Membre du Club Avatar de gaetan13
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Points : 56
    Points
    56
    Par défaut Execution dans un autre thread
    Bonjour,

    J'ai une petite question concernant les thread.
    J'ai une classe (qu'on va appeler class1) instanciée dans une autre (class2).

    Dans class1 j'ai une boucle d'écoute d'un port série, dans un thread.Je dois appeler une fonction qui ne doit pas être exécutée
    depuis le thread * car je n'ai pas envie que son code bloque la boucle....

    Du coup j'ai fais pas mal de tests (delegate etc) et à tous les coups la fonction est exécutée depuis le thread ce qui bloque ma lecture.

    L'idéal serait que depuis le thread du port je lance une fonction dans la classe qui soit bien exécutée dans le thread de la classe.

    Merci d'avance

    *Edit : Enfin, on appelle son exécution depuis le thread mais c'est un autre thread qui l'execute.

  2. #2
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    Jette un peu un œil au BackGroundWorker qui je pense pourrais t'aider
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  3. #3
    Membre du Club Avatar de gaetan13
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Points : 56
    Points
    56
    Par défaut
    Merci, mais je vois pas trop en quoi le backgroundworker réglerait mon problème de thread ?

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    un thread n'est pas lié à une classe

    si tu une instance de controle sous la main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lecontrol.begininvoke(délégué ou action)

    tous les controles ne peuvent être modifiés depuis le thread principal, aussi microsoft a mis l'outillage nécessaire sur la classe control permettant de mettre sur la pile du thread principal un appel à une méthode
    .invoke et .begininvoke (begininvoke étant non bloquant)


    il y a d'autres moyens, c'est peut etre aussi faisable avec le bgw
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre du Club Avatar de gaetan13
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Points : 56
    Points
    56
    Par défaut
    Merci, le problème de ces fonctions est quelles sont utilisables uniquement sur form, or je ne sais pas ou la fonction se situe : peut être dans une classe.

    Mais pour faire simple il faut que je lance une fonction depuis le thread crée mais qui ne va pas bloquer son execution, qu'elle s'execute dans le thread principal de l'application.

    Je sais pas si je suis très compréhensible.

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par gaetan13 Voir le message
    Je sais pas si je suis très compréhensible.
    non ... j'avais eut du mal à comprendre ton 1er post, mais là c'est pire, surtout que je pense avoir répondu à la question
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre du Club Avatar de gaetan13
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Points : 56
    Points
    56
    Par défaut
    Bnnjour,
    Tout d'abord merci de m'aider. J'ai pris des captures et fait un exemple pour être plus clair.

    J'ai ce code dans une boucle qui est dans le thread de lecture sur le port série :


    Ensuite on arrive ici :



    Le console.writeline de l'image 1 ne s'affichera jamais, mon appel bloque l’exécution du thread et j'aimerais y remédier.

    En réalité le Dispatcher est un Singleton qui va exécuter des méthodes dynamiquement dans le code qu'un utilisateur de l'API
    aura écrit pour interpréter ses propres packets. J'ai peur que son code bloque ma boucle comme je l'ai fait dans l'exemple.

    Merci

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,
    Pourquoi ne pas créer un nouveau thread qui executera cette méthode dynamique ? Ca ne risquera pas de bloquer un thread existant (le principal et celui de ta boucle)...
    eb.

  9. #9
    Membre du Club Avatar de gaetan13
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Points : 56
    Points
    56
    Par défaut
    Merci,
    Oui si j'ai pas d'autre solution c'est ce que je compte faire.

    Mais avec cette solution si l'utilisateur met dans sa fonction une modification d'un form par exemple il va avoir un invalid cross-thread op , donc ça ne sera plus très transparent pour lui vu qu'il faudra qu'il adapte son code.

  10. #10
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lecontrol.begininvoke(délégué ou action)
    tous les controles ne peuvent être modifiés depuis le thread principal, aussi microsoft a mis l'outillage nécessaire sur la classe control permettant de mettre sur la pile du thread principal un appel à une méthode
    .invoke et .begininvoke (begininvoke étant non bloquant)


    il y a d'autres moyens, c'est peut etre aussi faisable avec le bgw
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Membre du Club Avatar de gaetan13
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Points : 56
    Points
    56
    Par défaut
    Bien sur l'utilisateur peut utiliser cela mais j'aimerais qu'il n'ai pas à le faire. Et je ne peut pas le faire à sa place (enfin si c'est le cas je sais pas comment...)

  12. #12
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    je t'ai donné la solution (uncontrol.begininvoke, via openforms(0) si tu n'en as pas sous la main) que fais tu encore ici à continuer à poser la même question ?


    sinon en passant par asyncoperation ca permettrait d'être compatible avec autre chose que winforms (tu as l'air de parler d'utilisateur qui serait un développeur final)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  13. #13
    Membre du Club Avatar de gaetan13
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Points : 56
    Points
    56
    Par défaut
    Excusez moi mais ça me paraissait pas évident qu'il fallait utiliser un control qui n'as aucun rapport pour faire le BeginInvoke... En tout cas ça fonctionne...

Discussions similaires

  1. Appeler un executable dans une autre application
    Par highlight dans le forum C++
    Réponses: 13
    Dernier message: 20/04/2010, 16h24
  2. thread dans un autre thread
    Par lolo le belge dans le forum MFC
    Réponses: 2
    Dernier message: 13/01/2008, 20h57
  3. [.NET 2.0] Traitement graphique Lourd, exécuter dans un autre thread?
    Par jazz matazz dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 28/04/2007, 23h42
  4. Réponses: 1
    Dernier message: 17/03/2007, 21h21
  5. [C#] Comment appeler une fenêtre modale dans un autre thread ?
    Par Pilloutou dans le forum Windows Forms
    Réponses: 6
    Dernier message: 05/10/2006, 11h19

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