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

 Delphi Discussion :

Tâches à réaliser pendant l'affichage d'une SplashForm


Sujet :

Delphi

  1. #41
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Jlmat Voir le message
    j'ai testé le ProcessMessages dans la formSplash, ça fonctionne
    Bien sûr que ça va fonctionner mais c'était inutile dans ta demande d'origine qui ne concernait que de l'affichage. Mais si comme dans ton dernier exemple tu veux interagir avec la fenêtre, pas de miracle, il faut traiter les messages.

    Citation Envoyé par Jlmat Voir le message
    Dites moi si ça répond à vos questions.
    Je n'ai personnellement aucune question

  2. #42
    Membre actif
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 284
    Points : 287
    Points
    287
    Par défaut
    @ Andnotor, Oui, je me suis sans doute mal exprimé!

    Paul:
    ce que je sais par contre, c'est que du coup le splashscreen n'est pas la fiche principale, et du coup soit tu as une fiche qui ne répond pas (pas de Application.ProcessMessages), soit tu as une fiche qui n'est pas la fenêtre principale et ça fait buguer la barre de Tâche Windows par exemple.
    Andnotor:
    La boucle de messages n'est pas encore créée, l'application n'a aucune réponse à faire
    Vous avez soulevé avec Paul la question que le Fait de créer Splash avant la Forme principale pour l'utilisateur (peut-être pas pour Delph!?) ça pouvait empêcher cette fenêtre de traiter les messages windows. C'est donc important que j'éclaircisse ce problème qui vient en complément de ma question d'origine car La fiche utilisateur doit pouvoir traiter tout évènement (c'était sous entendu). Mais j'ai peut-être mal interprété ce que vous avez dit.

    C'est pour cette raison que j'essaye de voir si aussi bien dans la Form splash que dans celle de la fenêtre de l'utilisateur (Form1 ou FP dans mon exemple), le ProcessMessage fonctionnera correctement.

    Ai-je bien compris? Parce que si le problème n'est pas là, alors je n'ai pas compris de quels types d'interception de messages, vous parliez...
    Je programme en Lazarus 3.2.2 sous windows 10 pro

  3. #43
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Ça ne sert à rien d'aller plus loin sans expliquer un minimum le concept.

    Windows implémente une pile de messages globale.
    Chaque thread qui requiert une gestion des messages va créer un pile qui lui est propre. Tout processus possède au minimum un thread et toute application graphique nécessite une gestion des messages.
    Windows va transférer les messages de la pile globale dans les "sous-piles" en fonction de la cible.
    L'application va vider cette pile dans une boucle infinie et transférer ces messages (dispatch) aux différentes fiches qui les feront éventuellement suivre au composants, etc.

    La création de la pile du thread n'est pas automatique, c'est à l'application de la créer. Il n'y a pas de fonction particulière pour cela, elle est créée automatiquement au premier accès par GetMessage ou PeekMessage.
    Dans Delphi, c'est TApplication.Run qui intègre la boucle de récupération des messages et c'est à ce moment-là que la pile du thread principal est effectivement créée. Avant cela, l'application n'a pas de gestionnaire de messages.

    Mais une fenêtre n'a pas besoin de message pour se dessiner, WM_PAINT lui indique simplement que le rendu doit être rafraîchi suite à un autre événement : l'ordre d’empilement (Z-order) à changé, sa taille à changé, etc.

    Vient maintenant TApplication.ProcessMessages. Cette méthode implémente également une boucle qui va lire les messages à l'instar de Run (mais sans gestionnaire d'exceptions) et son but premier est que lorsque la boucle Run est bloquée sur le traitement d'un événement (ex. un clique sur un bouton lançant un traitement long) d'autres messages puissent toujours être traités (ex. un clique sur un bouton d'annulation, une repeinture, etc.).

    TApplication.Run et TApplication.ProcessMessages utilise la même méthode de récupération des messages : TApplication.ProcessMessage (au singulier). Dans les deux cas PeekMessage est invoqué et la pile est créée si elle n'existe pas encore. TApplication.ProcessMessages crée donc prématurément cette pile et tous les messages peuvent maintenant être récupérés. Mais cela implique aussi que TApplication.ProcessMessages soit appelé régulièrement (minimum toutes les 5 secondes) pour éviter un "L'application ne répond pas".

    En résumé, si la SplashForm ne fait qu'afficher du texte un TForm.Update régulier suffit et Windows ne dira rien si le traitement est long (c'est la pile du thread qui est contrôlée), mais s'il faut de l'interaction TApplication.ProcessMessages est nécessaire et devra également être invoqué régulièrement sous peine de voir l'OS râler.

    Il n'y a aucune contre-indication à l'un ou à l'autre, c'est fonction du besoin

  4. #44
    Membre actif
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 284
    Points : 287
    Points
    287
    Par défaut
    Merci Andnotor pour ce rappel théorique!
    Je programme en Lazarus 3.2.2 sous windows 10 pro

  5. #45
    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 : 54
    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 430
    Points
    28 430
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Application ne peut rien dispatcher puisque la pile de messages n'est pas créée. PeekMessage ne sera appelé que suite à Application.Run.
    C'est pour ça qu'on invoque directement Update.

    Et s'il n'y a pas de pile, l'OS n'a aucune raison de râler !
    dès que tu crées une fenêtre (HWnd) il y a une file d'attente de message qui lui est attachée...et si personne ne fait appel à GetMessage(), DispatchMessage() celle-ci n'est pas traitée.

    ensuite tu peux appeler Application.ProcessMessages avant d'appeler Application.Run, mais c'est un peu hasardeux et tu n'es pas à l'abris du rupture de comportement dans la VCL
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #46
    Membre actif
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 284
    Points : 287
    Points
    287
    Par défaut
    Merci Paul pour ces précisions.

    Je note tout ça dans un fichier... Du coup, je me replongerai sur la gestion des messages plus sérieusement. J'avais fait des récapitulations à une époque, mais je crois que ça fera l'objet d'un autre fil de discussion parce que j'aimerai bien finir celui là avec l'approche FMX proposée par Sergio...

    Mon projet avance petit à petit!

    Je programme en Lazarus 3.2.2 sous windows 10 pro

  7. #47
    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 : 54
    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 430
    Points
    28 430
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Ça ne sert à rien d'aller plus loin sans expliquer un minimum le concept.

    Windows implémente une pile de messages globale.
    Chaque thread qui requiert une gestion des messages va créer un pile qui lui est propre. Tout processus possède au minimum un thread et toute application graphique nécessite une gestion des messages.
    Windows va transférer les messages de la pile globale dans les "sous-piles" en fonction de la cible.
    L'application va vider cette pile dans une boucle infinie et transférer ces messages (dispatch) aux différentes fiches qui les feront éventuellement suivre au composants, etc.

    La création de la pile du thread n'est pas automatique, c'est à l'application de la créer. Il n'y a pas de fonction particulière pour cela, elle est créée automatiquement au premier accès par GetMessage ou PeekMessage.
    Dans Delphi, c'est TApplication.Run qui intègre la boucle de récupération des messages et c'est à ce moment-là que la pile du thread principal est effectivement créée. Avant cela, l'application n'a pas de gestionnaire de messages.

    Mais une fenêtre n'a pas besoin de message pour se dessiner, WM_PAINT lui indique simplement que le rendu doit être rafraîchi suite à un autre événement : l'ordre d’empilement (Z-order) à changé, sa taille à changé, etc.

    Vient maintenant TApplication.ProcessMessages. Cette méthode implémente également une boucle qui va lire les messages à l'instar de Run (mais sans gestionnaire d'exceptions) et son but premier est que lorsque la boucle Run est bloquée sur le traitement d'un événement (ex. un clique sur un bouton lançant un traitement long) d'autres messages puissent toujours être traités (ex. un clique sur un bouton d'annulation, une repeinture, etc.).

    TApplication.Run et TApplication.ProcessMessages utilise la même méthode de récupération des messages : TApplication.ProcessMessage (au singulier). Dans les deux cas PeekMessage est invoqué et la pile est créée si elle n'existe pas encore. TApplication.ProcessMessages crée donc prématurément cette pile et tous les messages peuvent maintenant être récupérés. Mais cela implique aussi que TApplication.ProcessMessages soit appelé régulièrement (minimum toutes les 5 secondes) pour éviter un "L'application ne répond pas".

    En résumé, si la SplashForm ne fait qu'afficher du texte un TForm.Update régulier suffit et Windows ne dira rien si le traitement est long (c'est la pile du thread qui est contrôlée), mais s'il faut de l'interaction TApplication.ProcessMessages est nécessaire et devra également être invoqué régulièrement sous peine de voir l'OS râler.

    Il n'y a aucune contre-indication à l'un ou à l'autre, c'est fonction du besoin
    je ne suis absolument pas d'accord avec tes explications.

    quand tu crées une fenêtre elle reçoit des tas de messages, ne serait-ce que parce que la souris passe devant (WM_MOUSEMOVE, WM_NCHITTEST et j'en passe)...et quand tu crées une fenêtre tu indiques explicitement la WndProc qui va traiter les messages, sauf que cette procédure n'est pas appelée que via le GetMessage/TranslateMessage qu'utilise Application.ProcessMessage...Car c'est bien dans le thread principal que sont traités tous les messages de l'application, il faut donc que le Thread principal demande explicitement le traitement des messages en attente.

    Update (qui appelle UpdateWindow) est une exception car Windows va invoquer directement la WndProc avec le message WM_PAINT sans passer par la pile de messages....donc oui ça actualise la fenêtre, mais ça ne traite pas pour autant les messages en attente.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #48
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Mon explication est quelque peu foireuse je le reconnais. Vous pouvez

    Citation Envoyé par Paul TOTH Voir le message
    quand tu crées une fenêtre elle reçoit des tas de messages, ne serait-ce que parce que la souris passe devant (WM_MOUSEMOVE, WM_NCHITTEST et j'en passe)...
    C'est un choix ! WS_EX_NOACTIVATE/WS_EX_TRANSPARENT permettent de limiter cela.

    Citation Envoyé par Paul TOTH Voir le message
    il faut donc que le Thread principal demande explicitement le traitement des messages en attente.
    Ben oui mais en attendant Run, on peut l'aider un peu

    Citation Envoyé par Paul TOTH Voir le message
    Update (qui appelle UpdateWindow) est une exception car Windows va invoquer directement la WndProc avec le message WM_PAINT sans passer par la pile de messages
    Ça n'a rien d'exceptionnel, c'est le principe de SendMessage.

Discussions similaires

  1. Affichage d'une image pendant le chargement
    Par abbd dans le forum Windows Forms
    Réponses: 3
    Dernier message: 25/04/2008, 21h34
  2. Réponses: 3
    Dernier message: 10/08/2007, 10h32
  3. Réponses: 7
    Dernier message: 04/04/2007, 15h18
  4. affichage d'une page pendant son chargement
    Par boss_gama dans le forum ASP
    Réponses: 3
    Dernier message: 17/08/2006, 18h04
  5. Réponses: 11
    Dernier message: 17/05/2006, 08h39

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