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

Langage Delphi Discussion :

Thread - mettre à jour une fiche


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 228
    Points : 93
    Points
    93
    Par défaut Thread - mettre à jour une fiche
    Bonsoir à tous,

    voilà mon problème : dans une application, j'ai une fiche (secondaire) que je crée et insère dans la fiche principale.

    je dois mettre à jour de temps en temps cette fiche secondaire mais le traitement est long car de nombreux composants.

    je souhaite le mettre à jour avec un thread mais je ne vois pas trop comment faire.

    je pensais pouvoir mettre à jour dans le thread et une fois terminée l'afficher dans la fiche principale...

    c'est à dire : puis-je passer la fiche au thread afin qu'il fasse cette mise à jour et ensuite l'afficher ?

    auriez-vous des conseils ?

    merci.

  2. #2
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 614
    Points
    3 614
    Par défaut
    Tout traitement touchant à des composants et déclenchant un affichage est susceptible de déclencher des erreurs si c'est fait ailleurs que dans le thread principal.

    Quelle partie du traitement est longue ? Est-ce vraiment le fait de renseigner les composants ?

    A-t-il été tenté de bloqué le "paint" de la fiche le temps de la mise à jour afin de ne le faire qu'à la fin ?

    Est-ce un projet VCL ou FMX ?

  3. #3
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 674
    Points : 7 063
    Points
    7 063
    Par défaut
    Citation Envoyé par Georges P Voir le message
    puis-je passer la fiche au thread afin qu'il fasse cette mise à jour et ensuite l'afficher ?
    Je passerais plutôt des fonctions de la fiche principale au thread (fonctions qui feraient les maj visuelles).
    Et l'appel de ces fonctions par le thread serait bien sûr avec un Synchronize.

  4. #4
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    J'ai eu un problème similaire avec des objets qui affichent des "charts" formés de plusieurs courbes dont chaque courbe est formée de milliers de points.
    A chaque rafraichissement, cela prenait du temps.
    J'ai utilisé un timer qui affiche partiellement chaque courbe pendant un certain temps (quelques millisecondes) puis sort de la boucle pour revenir plus tard (déclenché par le timer) et continuer le traitement là ou il s'était arrêté.
    A chaque fois qu'il recevait un wm-paint, il recommencait depuis le debut.
    Ca marche nickel, aucune gêne pour l'utilisateur, l'application reste fluide.
    Reste à déterminer le temps au bout duquel il faut sortir de la boucle.
    Le timer peut être de l'ordre de 10ms.

    Quel genre d'information prend-il du temps. Est ce que tu dessines sur un Canvas ?
    Si oui alors il y a peut être une autre solution en écrivant dans un TBitmap depuis un thread et de copier ce bitmap vers le canvas depuis la tache principale.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    Bonjour et merci pour vos retours.

    je suis en FMX et je n'ai pas tenter de bloquer le paint lors de la mise à jour.

    ma fiche comporte un grand nombre de composants et sa mise à jour est donc assez longue.

    je pensais qu'il était possible de passer la Form au thread, de la traiter puis de la renvoyer au thread principal via synchronize.

    je ne peux pas passer les fonctions au thread parce qu'il faut bien détruire des composants et en recréer à nouveau pour faire cette mise à jour de la fiche

  6. #6
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 614
    Points
    3 614
    Par défaut
    déjà utiliser un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    beginupdate;
    try
      //...
    finally
    endupdate;
    end;
    pour bloquer les mises à jour de l'écran qui sont faites dès que possible quand on bidouille des composants visuels

    ensuite, éventuellement basculer sur un comportement "plateforme" au lieu de "stylé" avec la propriété ControlType des composants concernés s'ils sont compatibles, ça permettrait d'alléger les routines d'affichage en passant par des éléments "natifs" plutôt que gérés par FMX, ce qui peut faire gagner du temps quand les écrans sont chargés

    mais comme on ne sait pas quelles modifications ni quels composants, on ne peut pas extrapoler plus

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 119
    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 119
    Points : 41 252
    Points
    41 252
    Billets dans le blog
    63
    Par défaut
    Citation Envoyé par Georges P Voir le message
    je pensais qu'il était possible de passer la Form au thread, de la traiter puis de la renvoyer au thread principal via synchronize.
    Je pense que c'est une mauvaise idée
    Citation Envoyé par Georges P Voir le message
    je ne peux pas passer les fonctions au thread parce qu'il faut bien détruire des composants et en recréer à nouveau pour faire cette mise à jour de la fiche
    Créer et détruire des composants sachant que ceci n'est pas thread-safe (je ne sais plus où j'ai lu ça, mais c'est le cas) pareil, ça me parait bien dangereux

  8. #8
    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 457
    Points
    28 457
    Par défaut
    c'est quoi "un grand nombre" ? car le problème est sans doute dans la méthode employée

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    Bonjour à vous,

    ok je vais donc abandonner le Thread au profit d'une optimisation préconiser par Pprem.

    je reviens vers vous si besoin.

    dans l'attente de mon retour, je mets quand même le fil en "Résolu"

    Encore merci.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    Bonjour Paul,

    c'est une fiche simulant un calendrier annuel avec une présentation d'un certain nombre de collaborateur.

    chaque collaborateur (par ligne) a son calendrier (plan de charge) celui-ci est composé de Radiant shapes multiplié par 365 jours ca commence à faire beaucoup de composants...

    j'utilise TGridPanelLayout pour bâtir mon calendrier

  11. #11
    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 457
    Points
    28 457
    Par défaut
    alors outre le nombre de composants, le fait d'utiliser un TGridPanelLayout va obliger Delphi à calculer la position de chaque composant alors que tu pourrais sans doute utiliser un bête Layout et positionner tes composants par code.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    ah oui !

    c'est une solution aussi.

    merci, je m'y penche..

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

Discussions similaires

  1. mettre à jour une JLabel
    Par Zobbiwan dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 05/01/2006, 18h33
  2. Prb mettre à jour une table via un fichier excel
    Par antier dans le forum Access
    Réponses: 3
    Dernier message: 02/12/2005, 10h31
  3. Mettre à jour une base sous SQL SERVER 2000
    Par FilipeVV dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 11/02/2005, 12h24
  4. Comment mettre à jour une ligne sans doublon via déclencheur
    Par fuelcontact dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/08/2004, 15h56
  5. Mettre à jour une table depuis une autre
    Par rsc dans le forum SQL
    Réponses: 4
    Dernier message: 09/07/2004, 10h08

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