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 :

TAniIndicator et Thread indissociables ? [Android]


Sujet :

Composants FMX Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Points : 98
    Points
    98
    Par défaut TAniIndicator et Thread indissociables ?
    Bonjour à tous,

    Je développe sous la version 10.2 Tokyo une application multi périphérique pour Android.

    Je fais appel à des API pour charger des données et le temps de traitement, en fonction de la qualité de connexion, peut être un peu long (3 à 10 secondes) ! Je voulais faire afficher un TAniIndicator pour faire patienter le client mais l'utilisation de ce petit compo semble plus compliqué que prévu

    Après quelques recherches, j'ai cru comprendre qu'Android gère ses processus de manière asynchrone : il faudrait que je colle mes appels de chargement de données dans des threads et synchronise le TAniIndicator pour que ce dernier s'affiche correctement.

    Est-ce que j'ai tout bien compris ou j'ai raté une étape ? je suis vraiment obligée de coller tous mes chargements un peu lourd dans des threads ?

    Merci pour vos éclaircissements

    delaio.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Points : 98
    Points
    98
    Par défaut
    bonjour à tous,

    Personne n'utilise TAniIndicator (le petit sablier rond) ? comment vous faites quand vos applis smartphones sous Android moulinent... vos clients ne s'impatientent pas à cliquer 100 fois sur le bouton ?

  3. #3
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    pour l'instant je ne me suis pas trouvé confronté à ce problème (je développe encore peu pour autres que Windows)
    En fait une seule fois je m'y suis trouvé confronté de manière plus globale mais avec un programme Intraweb+JQuery.

    Une réponse est peut être à cette adresse
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Points : 98
    Points
    98
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Une réponse est peut être à cette adresse
    ben vi... c'est bien ce lien que j'avais trouvé durant mes recherches... bon, ben si pas d'autres choix, c'est parti pour les threads...

  5. #5
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 931
    Points : 1 909
    Points
    1 909
    Par défaut
    Citation Envoyé par delaio Voir le message
    bonjour à tous,

    Personne n'utilise TAniIndicator (le petit sablier rond) ? comment vous faites quand vos applis smartphones sous Android moulinent... vos clients ne s'impatientent pas à cliquer 100 fois sur le bouton ?
    Bonjour,

    Voila ce que j'utilise pour afficher le sablier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
    var l_Svc: IFMXCursorService;
     
    begin
        if TPlatformServices.Current.SupportsPlatformService(IFMXCursorService, IInterface(l_Svc)) then
          l_Svc.SetCursor(crHourGlass);
         ....
    Mais pour l'instant je n'ai pas vraiment vu le sablier vu que je travaille avec des données locales et qu'il y en a pas encore des 'tonnes' à traiter.
    Tu n'as même pas besoin d'afficher le curseur normal en fin de traitement, car il le fait automatiquement à la sortie de la procédure.

    Je n'ai pas eu besoin de TAniIndicator.

  6. #6
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    Perso. sur Android pour le TAniIndicator j'utilise simplement la propriété Enabled

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par delaio Voir le message
    ben si pas d'autres choix, c'est parti pour les threads...
    C'est pas comme si c'était très difficile
    Citation Envoyé par Retwas
    Perso. sur Android pour le TAniIndicator j'utilise simplement la propriété Enabled
    sauf que cela ne fonctionne pas toujours (i.e. une boucle infinie dans lequel il n'y a aucun rafraichissement d'écran)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Points : 98
    Points
    98
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    C'est pas comme si c'était très difficile
    Certes... j'ai mal tourné ma phrase. j'aurais du dire : "si pas d'autres propositions..."

    Merci free07, je vais regarder.

    Perso. sur Android pour le TAniIndicator j'utilise simplement la propriété Enabled
    je rejoins Sergio : pas de prise en main de l'interface durant le chargement donc pas d'affichage du TAniIndicator... d'où les threads... (raison pour laquelle j'ai crée cette discussion : je souhaitais savoir comment vous faisiez...)

  9. #9
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par delaio Voir le message
    je rejoins Sergio : pas de prise en main de l'interface durant le chargement donc pas d'affichage du TAniIndicator... d'où les threads... (raison pour laquelle j'ai crée cette discussion : je souhaitais savoir comment vous faisiez...)
    je n'écrirai pas : pas d'affichage, l'animation sera affichée, mais plutôt pas d'animation << là où le bât blesse
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Points : 98
    Points
    98
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    je n'écrirai pas : pas d'affichage, l'animation sera affichée, mais plutôt pas d'animation << là où le bât blesse
    tu as raison, il faut être précis.

  11. #11
    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
    Mettre les chargements dans un thread, c'est la base pour une app Android ou iOS, sinon l'app freeze et le système va même balancer un message pour dire que l'app ne répond plus en proposant de la fermer. Sans parler des autres problèmes.
    Pour éviter que l'utilisateur touche à des trucs pendant ce temps, je mets un rectangle sur toute la page (semi-transparent), sur lequel est l'aniIndicator, car le risque avec un thread c'est que l'utilisateur appuie sur un bouton avant la fin puisque l'interface n'est pas désactivée automatiquement. Il n'y a pas de synchronisation particulière, je rends visible le rectangle, j'enable l'indicator, je lance le thread, et à la fin du thread désactive l'indicator et cache le rectangle.

  12. #12
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    sauf que cela ne fonctionne pas toujours (i.e. une boucle infinie dans lequel il n'y a aucun rafraichissement d'écran)
    Autant pour moi, il est mis à Enabled := True et le chargement dans une TTask

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Points : 98
    Points
    98
    Par défaut
    bonjour,

    Citation Envoyé par Coudrak Voir le message
    Mettre les chargements dans un thread, c'est la base pour une app Android ou iOS, sinon l'app freeze et le système va même balancer un message pour dire que l'app ne répond plus en proposant de la fermer. Sans parler des autres problèmes.
    Pour éviter que l'utilisateur touche à des trucs pendant ce temps, je mets un rectangle sur toute la page (semi-transparent), sur lequel est l'aniIndicator, car le risque avec un thread c'est que l'utilisateur appuie sur un bouton avant la fin puisque l'interface n'est pas désactivée automatiquement. Il n'y a pas de synchronisation particulière, je rends visible le rectangle, j'enable l'indicator, je lance le thread, et à la fin du thread désactive l'indicator et cache le rectangle.
    Merci Coudrak pour tes conseils et astuces ! je vais effectivement utiliser un rectangle pour empêcher la navigation durant le chargement...

    Citation Envoyé par retwas Voir le message
    Autant pour moi, il est mis à Enabled := True et le chargement dans une TTask
    Merci Retwas pour l'info : je découvre TTask mais sur sa mise en place, une subtilité a du m'échapper.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    procedure TForm1.creercompte_btClick(Sender: TObject);
    var thread_task : ITask;
    begin
      AniIndicator1.Visible := true;
      AniIndicator1.Enabled := true;
      Application.ProcessMessages;
      thread_task := TTask.Create(procedure()
      begin
        sleep(3000);
      end);
      thread_task.Start;
     
      TTask.WaitForAny(thread_task);
      AniIndicator1.Visible := false;
      AniIndicator1.Enabled := false;
      Application.ProcessMessages;
    end;
    le sablier apparait et disparait en temps et en heure mais il ne tourne pas. application.processmessages est approprié pour Android ? si tu peux m'en dire plus sur l'utilisation de TTask je prends (j'ai parcouru toutes tes discussions sur le sujet mais tu n'es pas très bavard ) idem concernant la fermeture de l'application durant le chargement : il n'y a pas un bout de code à mettre dans le form1.onclose ? je n'ai rien trouvé sur ce sujet concernant le TTask.

    merci.

  14. #14
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    C'est assez simple, par contre je suis contre les Application.ProcessMessages;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    procedure TForm1.creercompte_btClick(Sender: TObject);
    begin
       AniIndicator1.Visible := true;
       AniIndicator1.Enabled := true;
     
       TTask.Run(procedure(
                 begin
                    Sleep(3000);
     
                    TThread.Queue(TThread.CurrentThread,
    			procedure
    			begin
                               AniIndicator1.Visible := false;
    			   AniIndicator1.Enabled := false;
    			end);
                 end);
    end;

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Points : 98
    Points
    98
    Par défaut
    MERCI Retwas ! effectivement, c'est très simple, condensé et efficace (c'est exactement ce que je cherchais pour la lisibilité du code !)

    Pour ceux qui souhaitent en savoir plus sur Ttask :

    http://robstechcorner.blogspot.fr/20...ot-to-use.html

    par contre je suis contre les Application.ProcessMessages;
    pourquoi ? ce n'est pas approprié pour les applis multi périphériques ?

  16. #16
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par delaio Voir le message
    pourquoi ? ce n'est pas approprié pour les applis multi périphériques ?
    La plupart des Application.ProcessMessages que l'on peut voir sont pour rafraîchir un label ou autre, alors que la propriété .Refresh existe dessus.

    Le ProcessMessages dépile tous les messages empilé par Windows, c'est un peu dangereux j'ai déjà eu des problème.
    Il rend disponible ta fenêtre et l'utilisateur pourrais cliquer sur un bouton pendant ce temps la, le message est mis en fil d'attente par Windows et il pourrait executer un autre événement.

    Si tu utilises les Task, les traitements ne se font pas dans le thread principale de ton l'application, elle ne devrait donc pas freezer.

  17. #17
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    je suis totalement d'accord, il vaut mieux éviter ces ProcessMessages, d'ailleurs est-ce vraiment portable sous d'autres OS ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Points : 98
    Points
    98
    Par défaut
    bonjour,
    Citation Envoyé par SergioMaster Voir le message
    d'ailleurs est-ce vraiment portable sous d'autres OS ?
    d'où ma question

    Merci pour ces explications !

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Points : 98
    Points
    98
    Par défaut
    Je reviens quelques temps plus tard avec des infos complémentaires...

    Attention à un bug d'affichage avec TAniIndicator s'il tourne quand l'application est mise en arrière plan :
    https://www.developpez.net/forums/d1.../#post10010246

    jeu de tests sur les TTask et TAniIndicator pour traiter des chargements imbriqués :
    https://www.developpez.net/forums/d1...ion-programme/

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

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28
  3. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

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