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

Composants FMX Delphi Discussion :

Problème de rafraichissement de mon affichage


Sujet :

Composants FMX Delphi

  1. #1
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 097
    Points : 1 537
    Points
    1 537
    Billets dans le blog
    5
    Par défaut Problème de rafraichissement de mon affichage
    Bonjour à tous

    J'ai un programme qui reçoit des informations d'un autre programme via un protocole TCP géré par un composant TIdTcpServer dans la procedure OnExecute je récupère mes données et je fait appel à une fonction qui va les afficher à l'écran.

    Sur mon interface j'ai un bouton Enregistrement (btnEnrOp2) qui me permet de demander à l'autre programme d’enregistrer des données sur le disque et quand l'enregistrement est terminé c'est signalé dans les données envoyées via le protocole TCP.

    Ce qui est prévu c'est qu'après l’appui sur le bouton Enregistrement ce dernier devient invisible et je rends visible un autre bouton Arrêt d'urgence (btnArretUrgence) qui permet d'interrompre l'enregistrement si l'utilisateur s’aperçoit qu'il y a un problème.

    Donc lors de l'appui sur le bouton enregistrement voici ce que j’exécute:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    if (Sender = btnEnrOp2) then
        val(edNbMesOp2.Text, Valeur, err);
        if err = 0 then
        begin
          prgEnrOp2.Max := Valeur;
          prgEnrOp2.Value := 0;      
          btnMesTmpOp2.Enabled := false;
          btnSetFreqTiOp2.Enabled := false;
          btnEnrOp2.Visible:=false;
          btnArretUrgence.Visible:=true;
        end;
      end;
    Si avant la fin de l'enregistrement l'utilisateur appui sur le bouton d'arrêt d'urgence voici ce qui est exécuté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        btnMesTmpOp2.Enabled := true;
        btnSetFreqTiOp2.Enabled := true;
        btnEnrOp2.Visible:=true;
        btnArretUrgence.Visible:=false;
    Si l'utilisateur n’appuie pas sur le bouton d'arrêt d'urgence et laisse l'enregistrement se dérouler jusqu'à la fin, j'exécute aussi le code ci dessus afin de revenir à un affichage normal pour que l’utilisateur puisse faire un nouvel enregistrement.

    Si j’appuie sur l'un des boutons tout ce passe comme prévu à savoir disparition du bouton appuyé et apparition de l'autre. Par contre lorsque mon enregistrement se termine normalement mon interface n'est pas rafraichie et mon bouton d'arrêt d'urgence reste affiché.
    Autre phénomène étrange si jamais je déplace ma souris sur l'emplacement normalement occupé par mon bouton enregistrement l'interface se met à jour et redeviens normale.

    Par contre quand je détecte que mon enregistrement est terminé dans ma fonction de mise à jour de l'affichage

    Une idée?

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 466
    Points
    28 466
    Par défaut
    TIdTcpServer.OnExecute ne s'executerait-il pas dans un Thread secondaire ? auquel cas il ne faut pas toucher à l'interface utilisateur sauf à passer par un TThread.Synchronize()

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 288
    Points : 41 747
    Points
    41 747
    Billets dans le blog
    65
    Par défaut
    Bonjour,
    je pensais avoir répondu hier soir mais j'ai du faire une erreur de manip.
    Moi aussi je penchai pour un problème de thread du moins s'il y a ? Mais, ainsi que je l'avais écrit on a à la fois trop de code et pas assez.
    Je pense qu'une explication de la procédure val(edNbMesOp2.Text, Valeur, err); serait la bienvenue

  4. #4
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 097
    Points : 1 537
    Points
    1 537
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Je pense qu'une explication de la procédure val(edNbMesOp2.Text, Valeur, err); serait la bienvenue
    C'est pour récupérer la valeur de la longueur de l'enregistrement qui est saisie dans un Tedit par l'utilisateur.

    Et oui je soupçonne le TIdTcpServer.OnExecute de s'éxécuter dans un Thread secondaire.

    Du coup je pensais mettre un TTimer pour rafraichir les affichages de mon interface

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 720
    Points : 25 617
    Points
    25 617
    Par défaut
    Citation Envoyé par Gouyon Voir le message
    Et oui je soupçonne le TIdTcpServer.OnExecute de s'éxécuter dans un Thread secondaire.
    C'est même certains !
    Cela s'exécute dans un l'un des Threads du Pool de lecture de données

    Même dans un Timer, des données comme une string doit être protégé en écriture\lecture pour que le Thread ne modifie pas la valeur alors que le Timer l'utilise.
    J'ignore en FMX mais attention à aussi modifier depuis un Thread secondaire de modifier des Controles, cela pourrait être moche de modifier des valeurs par exemple en plein milieu du Paint.

  6. #6
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 097
    Points : 1 537
    Points
    1 537
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    C'est même certains !
    Cela s'exécute dans un l'un des Threads du Pool de lecture de données
    Voilà un doute de levé.
    Citation Envoyé par ShaiLeTroll Voir le message
    Même dans un Timer, des données comme une string doit être protégé en écriture\lecture pour que le Thread ne modifie pas la valeur alors que le Timer l'utilise.
    J'ignore en FMX mais attention à aussi modifier depuis un Thread secondaire de modifier des Controles, cela pourrait être moche de modifier des valeurs par exemple en plein milieu du Paint.
    Oui c'est un gag classique. En général pour éviter ça j'utilise un système de double buffer. Celui qui est affiché c'est celui qui n'est pas rempli par le thread de lecture et vice versa.

  7. #7
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 097
    Points : 1 537
    Points
    1 537
    Billets dans le blog
    5
    Par défaut
    Voilà j'ai mis le rafraichissement de mon affichage dans un TTimer et ça fonctionne beaucoup mieux.

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

Discussions similaires

  1. [Interface] FMX Problème de rafraichissement d'affichage
    Par Gouyon dans le forum C++Builder
    Réponses: 0
    Dernier message: 06/10/2020, 16h13
  2. Réponses: 3
    Dernier message: 11/03/2008, 12h25
  3. [DirectShow] problème lorsque je détruit mon graphe
    Par juldjin2 dans le forum DirectX
    Réponses: 1
    Dernier message: 04/02/2004, 22h30
  4. [JTree]problème de rafraichissement
    Par peppena dans le forum Composants
    Réponses: 9
    Dernier message: 20/01/2004, 15h06
  5. Toujours un problème de rafraichissement de DBGrid
    Par tripper.dim dans le forum C++Builder
    Réponses: 4
    Dernier message: 09/12/2002, 14h15

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