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 :

Blocage alléatoire sur la fonction .Render


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Developpeur Electronique/Info. Indus. - option bricolage
    Inscrit en
    Janvier 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur Electronique/Info. Indus. - option bricolage

    Informations forums :
    Inscription : Janvier 2007
    Messages : 26
    Par défaut Blocage alléatoire sur la fonction .Render
    bonjour,

    J'ai un souci que je n'arrive pas a résoudre. Mon application plante de temps en temps sur les fonctions graphiques et le logiciel reste bloqué. Mon application consiste à dessiner une courbe en fonction de données provenant d'une variable globale (type collection) mis a jour par une autre thread.
    Pour éviter le Multithreading graphique (car j'avais ce probleme avant et j'ai supposé que cela venait de ca) j'ai implanté un timer ... (je sais c'est pas très propre mais visiblement reste plus rapide qu'une thread indépendante mettant à jour le graphique)

    voici le bout de code. Le timer est calé sur 10ms et est mis en mode "enable" une fois la feuille affichée (mode MDI). Et, de façon aléatoire, j'obtiens le même problème qu'avant. :L'appli reste bloqué, et en mode débuggage, je met en pause et reste bloqué sur la ligne de rafraichissement "Render".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private void Timer2_Tick(System.Object sender, System.EventArgs e)
    		{
    			if (RUN_DRAW) return;
    			RUN_DRAW = true;
    			DrawToBuffer(grafx.Graphics, 0);
    			grafx.Render(Graphics.FromHwnd(HANDLE_ZONE));
    			RUN_DRAW = false;
    		}
    ------------------------------------------------------------------
    Si vous avez une idée du pourquoi du comment je suis preneur car la je m'arrache les cheveux . voir meme une solution ... ... ..

    Merci d'avance

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut
    Salut,

    10ms, c'est peut être beaucoup. Essaye peut être un intervalle plus long, pour voir si ça n'arrange pas un peu les choses. Essayes 100ms par exemple.
    A mon avis, ta fonction met plus de 10ms à s'éxecuter, donc à peine est-elle fini, que le flux repasse dans ta fonction. Et ton programme se gêle car il n'arrive plus à reprendre la main pour faire autre chose.

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    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 197
    Par défaut
    normalement on peut faire du render sur un thread séparé sans soucis


    le FromHwnd est ptete pas terrible, en tout cas pas obligatoire


    sinon essaye en mettant timer2.stop au début du void du timer et timer2.start à la fin du void

    si tu as des messages d'erreur il serait interressant de les donner
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre Expert
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Par défaut
    D'après ce que tu as dit, tu as au moins 2 thread, un pour le calcul de la courbe et l'autre pour l'affichage de la courbe.

    Et ce n'est malheureusement pas un timer qui va permettre de synchroniser les deux. Actuellement ton appli "gèle" car un thread essaie d'accéder à une variable appartenant à un autre thread, ou les deux threads essaie d'y accéder au même moment.

    Pour éviter cela, il faut donc vérifier que la variable est accessible avant d'y accéder.

    Regarde donc du côté de la propriété Control.InvokeRequired pour savoir si ton composant graphique peux être mis à jour.
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  5. #5
    Membre averti
    Homme Profil pro
    Developpeur Electronique/Info. Indus. - option bricolage
    Inscrit en
    Janvier 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur Electronique/Info. Indus. - option bricolage

    Informations forums :
    Inscription : Janvier 2007
    Messages : 26
    Par défaut
    Merci pour ces pistes , je vais essayer de voir chacune d'entre elle pour identifier le problème et le corriger.

    pour le message d'erreur, de tête, c'est justement un problème de thread-safe sur le context de periph , enfin l'accès graphique. J'ai lu sur le MSDN que l'on ne pouvait pas accéder par plusieurs thread au contrôle graphique. C'est pour cela que j'avais mis la chose dans un timer , et avait rendu ma feuille indépendante pour la partie affichage.

    Je vais d'abord essayer de me remettre en thread (j'aime pas les timers) mais avec un temps de 100ms comme vous me le conseiller. Et m'orienter aussi vers le partage des variables voir ce que je peux faire pour tester avant d'y accéder.

    Merci d'avance. en espérant que cela soit les réponses à mes soucis.

  6. #6
    Membre Expert
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Par défaut
    Regarde aussi du côté du mot-clé Volatile, qui permet à un champ d'être modifié par un autre thread (entre autre).

    Volatile sur msdn

    Volatile fields sur msdn
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  7. #7
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    hum ...

    Le Timer de System.Windows.Forms s'exécute en utilisant la boucle de messages de l'application et l'évènement Tick est toujours exécuté sur le thread graphique et il n'y a donc jamais deux threads différents dans le Tick au même moment (cette assertion n'est pas vraie pour le Timer de System.Threading).

    C'est pour cela que l'on a pas besoin de Control.InvokeRequired et Control.Invoke pour accéder aux objets de l'interface à partir de l'évènement Tick du System.Windows.Forms.Timer (on en a besoin pour le System.Threading.Timer).

    Et puis volatile ? lorsqu'on veut travailler avec plusieurs threads c'est pas cette chose qu'il faut invoquer mais la synchronisation classique des threads en .NET avec le mot cléf "lock" et par extension Monitor.Enter/Monitor.Leave.

    Après ce que tu pourrai essayer c'est faire le rendu dans l'évènement Paint du Graphique et appeler LeControlDuGraphique.Invalidate(true) dans le timer et aussi, passer par une PictureBox (en fait, si le dessin est fait en C# ce qui semble être le cas vu la signature apparente de DrawToBuffer, je ne vois pas ce qu'un "HANDLE_ZONE" et compagnie vient faire dans l'affaire ...)

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

Discussions similaires

  1. [XL-2007] blocage sur la fonction si
    Par cess2308 dans le forum Excel
    Réponses: 8
    Dernier message: 25/11/2011, 09h18
  2. [XL-2003] Blocage sur la fonction "linest"
    Par johannj dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/06/2009, 12h08
  3. Blocage sur la fonction de domaine DLookup
    Par pimst37 dans le forum VBA Access
    Réponses: 3
    Dernier message: 20/02/2008, 13h46
  4. blocage sur la fonction close()
    Par crischprolch dans le forum C
    Réponses: 3
    Dernier message: 23/01/2007, 13h28
  5. PerlDoc sur une fonction d'un module
    Par lesouriciergris dans le forum Modules
    Réponses: 2
    Dernier message: 13/03/2003, 20h50

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