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# Discussion :

Plantage après une boucle, dans le temps.


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Administrateur Systèmes, Clouds et Réseaux /CAO/DAO/Ingénierie Electrotechnique
    Inscrit en
    Décembre 2014
    Messages
    457
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur Systèmes, Clouds et Réseaux /CAO/DAO/Ingénierie Electrotechnique

    Informations forums :
    Inscription : Décembre 2014
    Messages : 457
    Par défaut Plantage après une boucle, dans le temps.
    bonjour, j'ai décidé de me faire un équivalent maison du filesystemwatcher mais d'une manière plus basique, celui ci ne correspondant pas à mes attentes.

    Donc en gros j'initialise une premiere liste, avec les ids des fichiers, puis je vais faire une boucle régulière qui dresse la liste des fichiers avec Directory.EnumerateFiles et qui traite uniquement ce qui change avec diverses boucles.
    J'ai pas de bug, la première initialisation me prendre 500ms max et les autres c'est variable en cas de changement ou pas, mais pour un fichier c'est 3à 5ms.

    A un moment donné le débugger me signale une erreur que je ne comprends pas vraiment, sous visual studio ça fait une page blanche, ça ne me dit pas qu'il y a une erreur dans le code, et je peux poursuivre ensuite.
    Ma boucle principale est planifiée sur 1ms de délais à chaque tour pour dresser cette liste.

    "Votre application est à l'état d'arrêt, mais aucun code pris en charge par le moteur de débogage sélectionné n'est en cours d'exécution (par exemple, seul du code de runtime natif est en cours d'exécution)."
    sur cette page blanche

    Et dans la partie sortie ça me marque:
    "Assistant Débogage managé 'ContextSwitchDeadlock'
    Le CLR n'a pas pu effectuer de transition du contexte COM 0x138a618 au contexte COM 0x138a560 pendant 60 secondes. Le thread qui possède le contexte/cloisonnement de destination est probablement en train d'attendre ou de traiter une opération très longue sans pompage des messages Windows. Cette situation a généralement des effets négatifs sur les performances et peut parfois entraîner le blocage de l'application ou une utilisation ininterrompue de la mémoire. Pour éviter ce problème, tous les threads STA (Single Threaded Apartment) doivent utiliser des primitives d'attente de pompage (par exemple CoWaitForMultipleHandles) et pomper de manière régulière les messages lors des opérations qui sont longues à s'exécuter.

    "

    Précision pour tester cette partie je ne me suis pas cassé la tête je l'iniatialise au loaded de l'applicatoin vu que j'étais principalement concentré sur la création de cette classe je ne voulais pas trop modifier mon code. Est ce que ça pourrait être en rapport ?

    Merci pour votre aide, là j'ai du mal à comprendrE.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 199
    Par défaut
    par défaut le code que tu tapes s'exécute sur le thread principal de l'application
    ce thread sert aussi au rafraichissement de l'interface (et le vidage de la pompe à message du coup)
    aussi quand on fait quelque chose de potentiellement long (genre plus de 200ms) ou à durée incertaine potentiellement longue (connexion à quelque chose de distant ...) on le fait sur un autre thread, ce qui évite que l'appli ne bloque

    si tu ne veux pas t'embeter avec les threads il y a le backgroundworker, ou encore les tasks
    par contre depuis un autre thread que le principal il est impossible de modifier l'interface, sinon ca plante, avec un thread on utilise alors des invokes, le backgroundworker a un event relayé sur le thread principal, et les tasks gèrent ca tout seul

    si tu veux faire un genre de timer sur un thread tu peux faire un while (true) { traitement + thread.Sleep(x millisecondes) }
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre expérimenté
    Homme Profil pro
    Administrateur Systèmes, Clouds et Réseaux /CAO/DAO/Ingénierie Electrotechnique
    Inscrit en
    Décembre 2014
    Messages
    457
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur Systèmes, Clouds et Réseaux /CAO/DAO/Ingénierie Electrotechnique

    Informations forums :
    Inscription : Décembre 2014
    Messages : 457
    Par défaut
    Merci pour ces informations, en fait jusqu'à présent j'avais correctement programmé donc ça ne m'était pas encore arrivé. Là j'ai voulu bâcler pour faire vite juste en appelant la fonction, donc je vais intégrer ça dans le reste proprement.

    je travaille avec des tasks pour les longs calculs donc ce type d'erreur ne m'étais jamais arrivé avant.

    Merci pour tout y compris pour le surplus d'information au cas ou.

  4. #4
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    si tu veux faire un genre de timer sur un thread tu peux faire un while (true) { traitement + thread.Sleep(x millisecondes) }
    Il me semble que dans les différentes classes de timer du framework il y en a une plus spécifiquement dédiée au Threads.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/01/2007, 13h06
  2. une boucle dans le Makefile?
    Par moon93 dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 28/06/2006, 14h08
  3. Réponses: 13
    Dernier message: 20/03/2006, 16h26
  4. Réponses: 3
    Dernier message: 06/07/2005, 13h57
  5. Creer une boucle dans une requête ???
    Par fdloisel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/10/2004, 14h05

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