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 :

Eviter le lag de mon application avec un Thread ? mais encore ?


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut Eviter le lag de mon application avec un Thread ? mais encore ?
    salut tout le monde

    mon application interroge une base de donnée, grâce à une requête http toutes les 1 seconde afin de savoir s'il y a de nouvelles entrées

    j'ai créé un thread qui s'occupe de faire l'interrogation

    le thread est exécuté chaque seconde grâce timer

    avant le code d'interrogation était dans le timer, mais il était impossible d'utiliser l'application tant ça lagait !

    avec le thread, le lag est fortement réduit, mais il existe toujours : par ex quand je déplace la fenêtre ou je saisie du texte, par moment ça bloque et c'est désagréable

    que me conseillez vous de faire ?

    merci

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 934
    Par défaut
    Il faut croire que le thread secondaire n'est pas suffisamment isolé et accède encore régulièrement au principal.
    Ou alors il a une priorité telle que le principal ne peut plus s'exécuter.

  3. #3
    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
    il n'y a aucune raison de déclencher le thread toutes les secondes, il suffit qu'il boucle avec une temporisation, mais pour ton lag, c'est que ton thread doit faire des Synchronize un peu trop souvent j'imagine
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre chevronné Avatar de blonde
    Femme Profil pro
    Développeur Delphi
    Inscrit en
    Septembre 2003
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Septembre 2003
    Messages : 278
    Par défaut
    En dehors de thread et de timer, ta requête est assez rapide ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut
    merci pour vos interventions

    @Andnotor je ne sais pas, je ne suis pas un pro non plus, je mettrai mon code

    @Paul TOTH j'ai toujours trouvé contradictoire l'utilisation d'un timer avec un thread, vu qu'on peut faire une boucle while, mais si je ne l'ai pas fait c'est parce que j'ai eu de mauvaises expériences passées. Après ton message j'ai voulu essayer à nouveau, mais là, mon application lag directe, on ne peut même pas killer !

    @blonde bah c'est pas énorme non plus, mais tout dépend aussi de la connexion internet de l'utilisateur et du serveur distant aussi, s'il n'est pas trop sollicité je suppose ? mais le problème ne se pose pas car j'ai réduit le code (au max), et ça lag encore

    voilà mon code (le principal) histoire d'avoir un visuel :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
      TInterrogation_BDD = class(TThread)
      private
        j: Integer;
        { Private declarations }
      protected
        procedure GetResult;
        procedure Execute; override;
      end;
     
     
    var
      mon_Thread: TInterrogation_BDD;
     
     
    procedure TInterrogation_BDD.GetResult;
    var
      test : boolean;
    begin
     
       test := true;
     
       while test do
       begin
         form1.Memo1.Lines.Add('sleep');
         sleep(1000);
       end;
     
    end;
     
     
    procedure TInterrogation_BDD.Execute;
    begin
      Synchronize(GetResult);
    end;
     
     
    // l'appel qui se fait une seule fois
     
    mon_Thread := TInterrogation_BDD.Create(false);
    une chose est sûr, c'est que le lag vient de ma boucle while, mais dans ce cas comment faire effet timer sans boucle infini ?

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut
    si je remplace : sleep(1000) par Application.ProcessMessages l'application devient fluide, génial, mais impossible de fermer l'application avec la croix rouge

    si je rajoute Application.ProcessMessages après le sleep, il y a lag ...

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 934
    Par défaut
    Le thread ne sert juste à rien puisque ta boucle est exécutée dans le thread principal du fait du synchronize.

    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
    procedure TInterrogation_BDD.GetResult;
    begin
      form1.Memo1.Lines.Add('sleep');
    end;
     
    procedure TInterrogation_BDD.Execute;
    begin
      while not Terminated do
      begin
        if ... then 
          Synchronize(GetResult);
     
        Sleep(1000);
      end;
    end;

  8. #8
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 604
    Billets dans le blog
    65
    Par défaut
    Bonsoir,
    je vais rajouter mon grain de sel en demandant : quelle version de Delphi est utilisée ?
    ce serait une bonne chose que de l'indiquer systématiquement au début d'une discussion (ou dans sa signature)
    Pourquoi j'écris ça ? Parce que maintenant les Threads anonymes c'est quand même bien

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Le thread ne sert juste à rien puisque ta boucle est exécutée dans le thread principal du fait du synchronize.

    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
    procedure TInterrogation_BDD.GetResult;
    begin
      form1.Memo1.Lines.Add('sleep');
    end;
     
    procedure TInterrogation_BDD.Execute;
    begin
      while not Terminated do
      begin
        if ... then 
          Synchronize(GetResult);
     
        Sleep(1000);
      end;
    end;
    tu avais vu juste ! de cette façon il n'y a plus de lag (pour du petit code)

    dans GetResult j'ai mis mon code d'interrogation de la bdd et j'ai encore ce léger lag

    comment le détecte ? en déplaçant la fenêtre sur mon écran, c'est pas fluide je pense lorsque mon code d'interrogation est exécuter

    question : dois je revoir mon code ? ou dois je me résoudre que le fait d'interroger un seveur est une action lourde ? mais en même temps je me dis que même s'il devrait avoir lag, le fait d'avoir un thread n'est pas censé justement passer inaperçu pour l'utilisateur ?

    @SergioMaster dsl je suis toujours sur delphi 7, c'est vrai qu'avec toutes les dernières versions, on peut s'y perdre ^^

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

Discussions similaires

  1. proteger mon application avec un serial
    Par futurist dans le forum VB 6 et antérieur
    Réponses: 17
    Dernier message: 17/09/2008, 14h01
  2. Etendre mon application avec du HTML
    Par bla69136 dans le forum MFC
    Réponses: 5
    Dernier message: 27/08/2008, 11h01
  3. Réponses: 1
    Dernier message: 14/11/2007, 13h11
  4. Réponses: 7
    Dernier message: 22/08/2007, 12h19
  5. [EasyPHP] Pb lors de la fermeture de mon application avec ou sans fermeture de Easy Php
    Par Lolie11 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 04/06/2007, 10h38

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