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

Lazarus Pascal Discussion :

Comment garder une interface active durant un long traitement (ou, de l'usage de ProcessMessages) ?


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 34
    Par défaut Comment garder une interface active durant un long traitement (ou, de l'usage de ProcessMessages) ?
    Bonjour,

    Je me casse les dents sur un problème ardu depuis une semaine sans avoir une bonne solution, et surtout sans comprendre le pourquoi du comment et le fonctionnement de ProcessMessages.

    Mon problème :
    J'affiche une trajectoire qui évolue constamment et que je calcule en même temps. Cela provoquait un scintillement très désagréable que j'ai résolu en utilisant un TCustomControl pour le doublebuffered (curieusement absent de TCustomGraphic ...) et en découpant mon image en petits bouts (grille d'images).

    Le problème maintenant est que seules les images modifiées généralement sont remises à jour.


    Précisions :
    - le seul cas où cela n'a pas lieu est lorsque je crée les images en même temps que le formulaire, mais pour diverses raisons je souhaite les créer à l'appel de la routine qui affiche la trajectoire

    - j'utilise application.ProcessMessages après la modification des images, ce qui semble bien les mettre à jour

    - ProcessMessages n'a aucun effet en l'utilisant après la création de la grille d'images dans la routine. En fait, elles apparaissent en flash, disparaissent, et éventuellement réappariassent une fois la routien finie !

    - suite à la lecture de http://users.telenet.be/sonal.nv/ics...ocessMessage03 il apparait qu'il ne faut pas utiliser ProcessMessages mais plutôt la méthode Update des contrôles. Après essai, cela fonctionne en effet : toutes les images s'affichent immédiatement. Il reste juste un léger problème ; le bouton permettant d'arrêter la routine n'est plus accessible puisqu'apparemment l'application ne traite plus automatiquement les messages ...

    - en rajoutant de temps en temps un seul ProcessMessages, l'accès au bouton revient, ce qui a pour effet immédiat ... d'effacer toutes les images qui ne sont pas modifiées !!!

    - puisqu'il semble y avoir un soucis entre le flux normal du programme, les évênements, les messages et leur traitement, j'ai essayé de lancer la longue routine via un chronomètre lui-même activer par le bouton, en espérant pouvoir ainsi libérer le bouton.. Résultat : à nouveau une fois lancée la routine ne peut plus être stoppée, le bouton étant inaccessible, et si on rend la main par un ProcessMessages, les images disaparaissent.


    Mes questions :
    - lorsqu'on crée un contrôle dans une routine, comment être sûr qu'il sera bien intégré au formulaire, donc mis à jour quand il faut ?

    - à quoi sert réellement ProcessMessages vu que dans le lien il semble bien qu'on n'ait pas le droit de l'utiliser

    - comment "bien concevoir" un programme dans le sens des interruptions et autres évênements "automatiquement" gérés par l'application ?

    - existe-t-il un manuel détaillés des objets en particulier des contrôles, pour freepascal ?

    - existe-t-il une alternative à ProcessMessages pour lire et traiter les évênements claviers et souris ?

    - comment éviter le problème du scintillement d'images remise à jour fréquemment sans avoir à les découper en morceaux, cela de façon fiable, simple, etc. ?



    Ah, j'oubliais. Selon que j'utilise ProcessMessages, TFrom.Update, ou d'autres méthodes pour garder toutes l'image sans que le clic ne soit pris en compte, il m'arrive même de ne pouvoir stopper le programme qu'en le tuant brutalement (Ctrl-F2 étant inopérationnel ...) !




    PS : il arrive que tous les boutons du formulaire passent manifestement en état "disabled" (écriture grisée) sans que cela ne soit programmé, auquel cas l'arrêt de la routine est très simple : cliquer sur un autre programme ; pourquoi donc sortiir la souris de dessus le bouton fait comme si j'avais cliqué dessus (sachant que ce bouton active et désactive alternativement un booléen pour arréter la routine) ?


    Voilà, j'attends votre aide pour résoudre tous ces mystères de freepascal.

  2. #2
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 139
    Billets dans le blog
    5
    Par défaut
    J'affiche une trajectoire qui évolue constamment et que je calcule en même temps. Cela provoquait un scintillement très désagréable que j'ai résolu en utilisant un TCustomControl pour le doublebuffered (curieusement absent de TCustomGraphic ...) et en découpant mon image en petits bouts (grille d'images).

    Le problème maintenant est que seules les images modifiées généralement sont remises à jour.
    Personnellement j'utiliserais plutôt les threads. Un thread qui fait les calculs l'autre qui affiche les résultats.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 34
    Par défaut
    Certes, certes.

    Mais ne compliquons pas tout en même temps ! Enfin, si c'est possible ...

  4. #4
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Par défaut
    Citation Envoyé par pem1996 Voir le message
    Certes, certes.

    Mais ne compliquons pas tout en même temps ! Enfin, si c'est possible ...
    J'ai pas pu lire tout ton post, mais si j'ai bien compris le bouton ne réagit plus quand tu lances des traitements.

    Comme les traitements sont exécutés dans le flux normale du programme, les évènements ne sont plus gérés. La solution serait de lancer les taches en parallèle. Comme l'a dit Gouyon, c'est ce que font les Thread.

  5. #5
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 139
    Billets dans le blog
    5
    Par défaut
    Justement les threads simplifieront ton problème et ne sont pas extrêmement compliqués à metrre en oeuvre (voir FAQ).

    lorsqu'on crée un contrôle dans une routine, comment être sûr qu'il sera bien intégré au formulaire, donc mis à jour quand il faut ?
    Je ne comprend pas bien de quoi tu parles. As tu un exemple de code?
    - à quoi sert réellement ProcessMessages vu que dans le lien il semble bien qu'on n'ait pas le droit de l'utiliser
    C'est lié au système d'exploitation Windows. En gros un programme scrute en boucle une liste de message. Cette liste est mise à jour lorsqu'un évènement survient (par exemple un appuis sur un bouton de souris). Dans certain cas le traitement d'un de ces message peut être long voir bloquant. ProcessMessage permet de forcer le traitement des messages qui attendent dans la liste.
    On a parfaitement le droit de l'utiliser mais ça ne sert à rien si il n'y a pas de message en attente
    - comment "bien concevoir" un programme dans le sens des interruptions et autres évênements "automatiquement" gérés par l'application ?
    Vaste sujet. Ceci dit c'est un peu plus facile avec les outils de maintenant et je ne vois pas ou est la difficulté.
    - existe-t-il un manuel détaillés des objets en particulier des contrôles, pour freepascal ?
    L'aide en ligne de Lazarus entre autre sinon j'utilise beaucoup la FAQ et les forum Delphi
    - existe-t-il une alternative à ProcessMessages pour lire et traiter les évênements claviers et souris ?
    Inutile d'utiliser ProcessMessages il suffit d'écrire un méthode qui traite l'évènement. Voir l'onglet évènement dans l'inspecteur d'objet des contrôles.
    - comment éviter le problème du scintillement d'images remise à jour fréquemment sans avoir à les découper en morceaux, cela de façon fiable, simple, etc. ?
    Mettre le propriété doublebuffered à true; Ceci dit il y a toujours un petit effet de scintillement mais bien moindre.

  6. #6
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Par défaut
    Citation Envoyé par Gouyon Voir le message
    Mettre le propriété doublebuffered à true; Ceci dit il y a toujours un petit effet de scintillement mais bien moindre.
    Une solution serait peut etre d'utilisé des bibliothèques graphiques comme OpenGL/SDL lorsqu'on veut faire des traitements graphique assez lourds.

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    bonjour,

    ta question n'est pas très claire...enfin son contexte en tout cas ne l'est pas.

    que sont tes images ? quel composant ou quelle méthode utilises-tu pour les dessiner ?

    il faut garder à l'esprit qu'une application Windows est (sauf à utiliser des Thread) résolument monotâche.

    le coeur de l'application est une boucle qui attend un message (Application.ProcessMessages) pour déclencher le traitement lié (Button1Click). Cet appel interrompt la boucle de lecture des messages, donc aucun autre évènement n'est traité en attendant la fin de la procédure invoquée.

    Dans ta question tu parles d'une modification de trajectoire qui évolue constamment...est-ce donc que ton programme boucle sur une procédure de mise à jour ? auquel cas le ProcessMessages n'a pas lieu sauf si tu l'invoques explicitement.

    Est-ce un message (un Timer par exemple) qui provoque la mise à jour de l'affichage ? on l'absence de message (Application.OnIlde) ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Comment faire une interface de ce type....
    Par SpiderAlpha dans le forum C++Builder
    Réponses: 6
    Dernier message: 30/04/2007, 13h50
  2. Comment réutiliser une interface d'un scannner ?
    Par baume dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 18/06/2005, 00h08
  3. comment construire une interface comme une pomme...
    Par redanium dans le forum C++Builder
    Réponses: 3
    Dernier message: 29/10/2004, 15h35
  4. comment fonctionne une interface graphique???
    Par elekis dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 27/10/2004, 23h10
  5. Comment créé une "interface" pour mes programmes??
    Par alcazar dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 09/02/2004, 13h02

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