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 :

Lenteur d'un événement Timer [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2015
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Lenteur d'un événement Timer
    Bonjour,

    Ma configuration :

    Lazarus : 1.6 ; FPC : 3.0 ; OS : Raspbian ; RaspberryPi : 3.0

    Descriptif :

    Le composant Timer me génère un événement tous les 10ms et effectue une action via une procédure sous condition.
    Dès le début de l'événement je désactive le timer et après l'action je le réactive.
    Le traitement de l'action(si condition réunis) se fait sans aucun problème pendant les quatre premières heures environ.
    Passé ce délais l'action s'effectue correctement mais avec beaucoup de lenteur(cas identique en mode débogage ou pas).

    Questions :

    Quels sont les outils sous Lazarus pour contrôler la mémoire, pile... ?
    Quels sont les options de compilation à adopter ?

    En vous remerciant,

  2. #2
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Salut,
    Citation Envoyé par BYLS07 Voir le message
    Quels sont les outils sous Lazarus pour contrôler la mémoire, pile... ?
    Quelles sont les options de compilation à adopter ?
    Àmhà ce n'est pas de ce côté qu'il faut chercher, je verrais plutôt un espace disque qui se remplit, de la mémoire allouée et non libérée, ce genre de choses...

    Citation Envoyé par BYLS07 Voir le message
    Le traitement de l'action (si condition réunie) se fait sans aucun problème pendant les quatre premières heures environ.
    Passé ce délai l'action s'effectue correctement mais avec beaucoup de lenteur (cas identique en mode débogage ou pas).
    Parce qu'en général, un timer fera toujours la même chose, et c'est ce sur quoi il travaille qui va évoluer et éventuellement partir en vrille, au bout d'un certain temps ("quatre heures environ").
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut pour une longue période il faut utiliser TIdleTimer
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2015
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Merci pour vos pistes d'actions,
    - J'ai contrôlé l'espace disque avec l'application en exécution -->sans changement
    En ce qui concerne la mémoire allouée et non libérée :
    - j'ai recontrôlé la définition de mes variables, rien de ce coté apriori.
    - À l'aide d'un bouton et des fonctions ('FreeAndNil', 'free' et 'destroy'), j'ai contrôlé en libérant certains objets après 4heures, mais sans résultat.


    Je vais essayer avec TIdleTimer et je vous tiens au courant.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2015
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    J'ai essayé avec TIdleTimer, il semblerait qu'il y ait une légère amélioration, mais pas suffisante. Le problème réside effectivement dans la libération de la mémoire.
    Je regarde sur le partage des variables/objets entre les unités, je vais aussi réviser sur le forum (un lien ?)

    Du coup je rentre plus dans le détail mais sans vous inonder de code(ça viendra...;-) ) :
    Au raspberry(RPI), j'ai associé une carte E/S MCP23S17 http://www.pridopia.co.uk/pi-23s17-8-v3.html.
    Après plusieurs tentatives auprès d'autres librarys(PiGPIO, RPI_HAL, WiringPI), depuis le raspberry pour bien communiquer avec cette carte j'utilise la library PXL http://asphyre.net/products/pxl
    L'utilisation de trois objets en cascade permet de faire la liaison entre la carte et le raspberry :
    Objet1 -> Map du système RPI
    Objet2 -> Gestion des ports GPIO RPI(en paramètre : Objet1)
    Objet3 -> Gestion du bus SPI(en paramètre : Objet2)
    L'Objet3 me permet aisément de lire ou d'écrire sur la carte E/S. C'est cet objet que je sollicite tous les 10ms.
    Je crée l'objet3 au démarrage de l'application, je l'utilise dans le timer 10ms et je le libère en fin d'application.

    Question :
    Est-ce qu'il vaut mieux le créer à l'événement timer et le libérer en fin de l'événement timer (Test en cours) ?

  6. #6
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut



    Est-ce qu'il vaut mieux le créer à l'événement timer et le libérer en fin de l'événement timer (Test en cours) ?
    Dur de répondre.

    Qu'elles sont les classes de "Object1,2 et 3 " ?
    Un petit bout de code de comment tu initialises, utilises et détruits ces objets serai le bienvenue.

    Le problème vient peut-être de ces objets (je parles de leur code dans la librairie Pxl, et non de ton code).
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2015
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    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
     
    interface
     
    uses
      Classes, SysUtils,PXL.Boards.RPi, PXL.Boards.Types;
    {...}
    implementation
    var
      FSystemCore: TFastSystemCore;
      FRPI_GPIO: TFastGPIO;
      FRPI_BusSPI: TFastSPI;
     
    procedure Proc_Init_MCP23S17x8extRPI;
    begin
      {ouverture du bus SPI sur le RPI :
      Mode : 0
      Chip Select (CS): 0
      fréquence : 8000000Hz (8MHz) 10Mhz maximum supporté par les MCP23S17
      }
      FSystemCore:= TFastSystemCore.Create;
      FRPI_GPIO:= TFastGPIO.Create(FSystemCore);
      FRPI_BusSPI:=TFastSPI.Create(FRPI_GPIO,TFastSPI.DefaultChipSelect, 8000000, TFastSPI.DefaultMode);
    Une des procédures que j'appelle dans mon timer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function Fonc_LectureUx(Ux:integer):word;
    var
      BufferE : longword;
      OctetsEcrit: integer;
    begin
      BufferE:=  (REG_GPIOA)<< 8;
      BufferE:=  BufferE + (Ux_ADDRESS[Ux] or %00000001);  //lecture du registre 
      OctetsEcrit :=FRPI_BusSPI.Transfer(@BufferE,@BufferE,4);//4 ou sizeof(BufferE));
      result:=BufferE>>16;
    end;
    les constantes ou tableaux de constantes sont représentés en majuscule

  8. #8
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 952
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 952
    Points : 9 281
    Points
    9 281
    Par défaut
    hello,
    pour traquer les fuites mémoire, il faut utiliser heaprc voir ici

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  9. #9
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut mis à part or %00000001 je ne vois rien. Cela ne serait pas plutôt or or $00000001Je te suggère également d'englober tes procs de lecture/écriture dans des block Try...Except...Finally

    Petite question as-tu un message d'erreur qui s'affiche à moment X ?

    Le problème vient peut-être de une des tes autres procédures que tu appels dans le timer.

    EDIT : Petite question subsidiaire : Pourquoi n'avoir pas fais une application console comme dans les exemples de la librairie PXL ?
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2015
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Salut,
    Citation Envoyé par BeanzMaster Voir le message
    Salut mis à part or %00000001 je ne vois rien. Cela ne serait pas plutôt or or $00000001
    %--> pour me rappeler que je travaille sur le bit de lecture/écriture en l’occurrence le huitième sur la trame opcode du MCP23S17

    Citation Envoyé par BeanzMaster Voir le message
    Je te suggère également d'englober tes procs de lecture/écriture dans des block Try...Except...Finally
    oui, je vais y travailler, mais je doute que ça amène un gain de rapidité, néanmoins ça peut mettre de la lumière sur certains éléments -> merci

    Citation Envoyé par BeanzMaster Voir le message
    Petite question as-tu un message d'erreur qui s'affiche à moment X ?
    c'est également une piste que je suis en train d'explorer après avoir supprimer les filtres, j'ai quelques messages du compilateur :

    Hint: Mixing signed expressions and longwords gives a 64bit result
    Warning: "crtbegin.o" not found, this will probably cause a linking failure
    Warning: "crtend.o" not found, this will probably cause a linking failure
    Pour l'instant je fais l'impasse sur les deux "warning", car ils y sont depuis le début et même sur application vide, mais si quelqu'un peut me l'expliquer je suis preneur. Je me consacre plus sur le hint et le travail sur les mots binaires, car comme il l'indique il se peut que ça augmente les cases mémoires.

    Citation Envoyé par BeanzMaster Voir le message
    Le problème vient peut-être de une des tes autres procédures que tu appels dans le timer.
    C'est ce que j'ai pensé au début, du coup j'ai limité mon timer sur l'appel de ces deux procédures voire de qu'une seule, avec le même résultat.

    Citation Envoyé par BeanzMaster Voir le message
    EDIT : Petite question subsidiaire : Pourquoi n'avoir pas fais une application console comme dans les exemples de la librairie PXL ?
    pour une application domotique ce n'est pas très conviviale la console.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2015
    Messages : 11
    Points : 9
    Points
    9
    Par défaut heaprc
    Citation Envoyé par jurassic pork Voir le message
    hello,
    pour traquer les fuites mémoire, il faut utiliser heaprc voir ici

    Ami calmant, J.P
    Merci pour cette piste, après avoir paramétrer le compilateur, heaptrc me retourne :
    Heap dump by heaptrc unit
    0 memory blocks allocated : 0/0
    0 memory blocks freed : 0/0
    0 unfreed memory blocks : 0
    True heap size : 0
    True free heap : 0
    apriori tout à l'air bien, non ?

    Du coup j'ai essayé valgrind avec l'outil callgrind mais ça reste bloqué et l'application P_CarteESlibPXL ne se lance pas :

    valgrind --tool=callgrind ./P_CarteESlibPXL
    ==4633== Callgrind, a call-graph generating cache profiler
    ==4633== Copyright (C) 2002-2011, and GNU GPL'd, by Josef Weidendorfer et al.
    ==4633== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
    ==4633== Command: ./P_CarteESlibPXL
    ==4633==
    ==4633== For interactive control, run 'callgrind_control -h'.
    --4633-- WARNING: Serious error when reading debug info
    --4633-- When reading debug info from /lib/arm-linux-gnueabihf/ld-2.24.so:
    --4633-- Ignoring non-Dwarf2/3/4 block in .debug_info
    --4633-- WARNING: Serious error when reading debug info
    --4633-- When reading debug info from /lib/arm-linux-gnueabihf/ld-2.24.so:
    --4633-- Last block truncated in .debug_info; ignoring
    --4633-- WARNING: Serious error when reading debug info
    --4633-- When reading debug info from /lib/arm-linux-gnueabihf/libdl-2.24.so:
    --4633-- Ignoring non-Dwarf2/3/4 block in .debug_info
    --4633-- WARNING: Serious error when reading debug info
    --4633-- When reading debug info from /lib/arm-linux-gnueabihf/libdl-2.24.so:
    --4633-- Last block truncated in .debug_info; ignoring
    Le fichier callgrind est bien créer mais avec rien dedans...dommage car j'avais installé KCachegrind.

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

Discussions similaires

  1. Ecouter un évènement Timer dans plusieurs classes
    Par FloBaoti dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 06/01/2008, 00h55
  2. [VB6] Sortir d'une classe par gestion d'évènement (Timer) externe ...
    Par marsup54 dans le forum VB 6 et antérieur
    Réponses: 21
    Dernier message: 04/05/2006, 23h13
  3. Problème de déclenchement d'évènements dans un timer
    Par ArkSquall dans le forum Composants VCL
    Réponses: 18
    Dernier message: 30/04/2006, 21h32
  4. Réponses: 7
    Dernier message: 08/12/2005, 17h37
  5. Réponses: 7
    Dernier message: 23/08/2005, 15h56

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