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 :

Application.ProcessMessages : vraiment le mal ?


Sujet :

Composants FMX Delphi

  1. #1
    Membre régulier Avatar de Coudrak
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 66
    Points : 90
    Points
    90
    Par défaut Application.ProcessMessages : vraiment le mal ?
    Bonjour,

    J'ai souvent lu des gens qui déconseillaient l'utilisation de la fonction Application.ProcessMessages sans que je ne comprenne jamais pourquoi.

    Dans mon application pour mobile Android, j'utilise cela dans une boucle pour attendre la fin des threads (qui lancent une requête HTTP avec DataSnap).
    Ca a l'avantage d'attendre (rien ne doit se passer avant la fin de la requête, donc je veux attendre la fin du thread.

    Par exemple comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      thread := TThread.CreateAnonymousThread(procedure
      begin
          json := ClientModule.ServerMethods1Client.GetUserListFromServer(params);
          Env.LastResponse := Now;
      end);
     
      thread.FreeOnTerminate := True;
      thread.Start;
      while not thread.Finished do
        Application.ProcessMessages;
     
      Result := json;
    Je sais que l'autre façon de faire est d'envoyer un pointeur de procédure sur le OnTerminate du thread, mais ça me demanderait beaucoup de changements dans mon app dont le code est déjà complexe.

    Cette boucle avec Application.ProcessMessages peut-elle provoquer des problèmes, lags, freeze ou bugs (surtout sur Android/iOS)... ? Est-ce vraiment à éviter autrement que pour du purisme de codeur ? Merci !

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 857
    Points : 11 291
    Points
    11 291
    Billets dans le blog
    6
    Par défaut
    Ce qui m'étonne, c'est de tester si un thread libéré (FreeOnTerminate) est Finished, à moins qu'il n'y ait latence avant sa libération...

    A signaler, une lecture intéressante ici, même si elle ne répond pas à ta problématique de ne pas trop modifier ton code.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    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 Coudrak Voir le message
    Cette boucle avec Application.ProcessMessages peut-elle provoquer des problèmes, lags, freeze ou bugs (surtout sur Android/iOS)... ? Est-ce vraiment à éviter autrement que pour du purisme de codeur ? Merci !
    le principal problème avec ProcessMessages c'est que cela peut provoquer un traitement en boucle, exemple dans Button1Click je fais une boucle longue qui inclut un ProcessMessages...je peux donc de nouveau cliquer sur le bouton, ce qui va relancer une nouvelle boucle qui elle même appellera ProcessMessages qui me permettra de cliquer à nouveau sur le bouton qui....

    à contrario, si je supprime le ProcessMessages, je ne peux plus cliquer sur le bouton puisque les messages souris ne sont plus gérés, mais l'interface utilisateur est gelée puisque les messages concernant l'affichage ne sont pas no plus traités.

    les solutions proposées par Marco sont standards:

    1) faire le traitement par petits bout dans un Timer (quand c'est possible)
    2) lancer le traitement en tâche de fond
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 102
    Points
    13 102
    Par défaut
    FreeOnTerminate est implicite dans un thread anonyme. Pas besoin de le redéfinir

    Sinon, je rejoins tourlourou : si un traitement long est en attente et que Application.ProcessMessages le démarre, il y a des chances pour que le thread soit déjà libéré à la prochaine boucle entraînant une VA sur le test. Mieux vaut un WaitForSingleObject sur son handle (à voir sur mobile).

    Mais désactiver certaines fonctions (boutons) durant le traitement serait plus à mon goût.

  5. #5
    Membre régulier Avatar de Coudrak
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 66
    Points : 90
    Points
    90
    Par défaut
    @tourlourou: merci pour le lien, très intéressant vu que je fais une app pour mobile.

    @Paul: oui effectivement, je veux que l'IHM soit désactivée, sauf l'icône animée de chargement (TAniIndicator).

    @Andnotor: ouep, bon après réflexion je pense que finalement je vais opter pour faire les grosses modifs de mon code et me passer d'une boucle qui attend le thread, et réfléchir à désactiver mon IHM jusqu'au OnTerminate.

    Merci à vous trois !

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 03/12/2007, 11h06
  2. Dépassement de pile et Application.ProcessMessages
    Par Bruno13 dans le forum Delphi
    Réponses: 3
    Dernier message: 20/03/2007, 10h35
  3. Application.ProcessMessages dans une table
    Par sondo dans le forum Bases de données
    Réponses: 11
    Dernier message: 04/02/2007, 14h16
  4. Blocage même avec Application.ProcessMessages
    Par Sub0 dans le forum Delphi
    Réponses: 7
    Dernier message: 31/01/2007, 05h13
  5. problème avec Application->ProcessMessages()
    Par petitours dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/08/2005, 10h27

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