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 C++ Discussion :

Fichier texte et Temps Réel, comment faire ?


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Fichier texte et Temps Réel, comment faire ?
    Bonjour,

    je suis débutante/intermédiaire en C++ (Visual Studio) et j'ai conçu un petit programme pour un projet qui permet de lire un fichier texte et d'enregistrer les valeurs voulus, contenus dans celui-ci. Par la suite, je fait un affichage des données receuillis avec les fonctions CDC (CRect,lineto,moveto,...) d'MFC dans un rectangle. Tout marche bien, cependant, il faut arriver à adapter ce programme en TEMPS RÉEL, ce qui n'est pas le cas pour l'instant, et je n'y connait vraiment rien....

    En gros, on reçoit des données d'un tocographe (appareil permettant de détecter les contractions utérines) sur le fichier texte à toute les 0.25 secondes. Il faudrait donc que notre prog aille chercher les données voulus à chaque 0.25secondes dans le fichier texte et que notre fenêtre d'affichage soit rafraichit à ce même taux d'échantillonage...

    Des idées ??? Des fonctions déja existantes en MFC ??
    Merci énormément d'avance !!

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour et bienvenu,
    D'abord, il te faut estimer ce qui prend le + de temps : la lecture du fichier ou l'affichage.
    Pour l'affichage, tu peux essayer un double buffering : tu fais ton rendu dans un CDC mémoire et tu fais juste un blit pour l'affichage.
    Pour la lecture du fichier, il faudrait analyser ce qui prend du temps pour savoir vers quel axe rechercher les optimisations : chargement, lecture du fichier, construction des données ?

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Si tu veux t'approcher du temps réel, il faudra probablement séparer ton programme en deux parties, et en deux threads (voire deux processus) :
    -Un, tournant en assez haute priorité, lisant les valeurs de ton tocographe et les écrivant dans une structure mémoire comme une queue, protégée par un mécanisme de synchronisation (mutex, critical_section...), mais ne faisant aucun appel au système de fichier ou à l'affichage
    - Un autre, tournant en priorité normale, lisant les valeurs dans la queue précédente (en gardant le lock le moins longtemps possible), et gérant tous les aspects pour lesquels le timing n'est pas crucial (affichage, écriture dans un fichier...)

    Cette architecture permettra d'éviter par exemple qu'un délai dans l'affichage (parce que l'utilisateur est ent rain de bouger une fenêtre, ou qu'un antivirus scanne un fichier) n'ait un impact trop important sur la tâche qui doit vraiment avoir lieu à fréquence bien définie.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Bonjour et bienvenu,
    D'abord, il te faut estimer ce qui prend le + de temps : la lecture du fichier ou l'affichage.
    Pour l'affichage, tu peux essayer un double buffering : tu fais ton rendu dans un CDC mémoire et tu fais juste un blit pour l'affichage.
    Pour la lecture du fichier, il faudrait analyser ce qui prend du temps pour savoir vers quel axe rechercher les optimisations : chargement, lecture du fichier, construction des données ?
    Merci pour votre ta réponse, elle est très appréciée.

    Est-ce que tu sais vers quelles fonctions se tourner en MFC pour le blit?...J'ai rien trouvé sur le net, et puis, je suis pas hyper expérimentée..

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par prog_ Voir le message
    Merci pour votre ta réponse, elle est très appréciée.

    Est-ce que tu sais vers quelles fonctions se tourner en MFC pour le blit?...J'ai rien trouvé sur le net, et puis, je suis pas hyper expérimentée..
    Salut,
    Tu peux regarder cette discussion et ce lien.
    P.S. : je regrette de ne pas avoir eu spontanément l'idée de Loïc qui me semble aussi une bonne piste à explorer .

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Si tu veux t'approcher du temps réel, il faudra probablement séparer ton programme en deux parties, et en deux threads (voire deux processus) :
    -Un, tournant en assez haute priorité, lisant les valeurs de ton tocographe et les écrivant dans une structure mémoire comme une queue, protégée par un mécanisme de synchronisation (mutex, critical_section...), mais ne faisant aucun appel au système de fichier ou à l'affichage
    - Un autre, tournant en priorité normale, lisant les valeurs dans la queue précédente (en gardant le lock le moins longtemps possible), et gérant tous les aspects pour lesquels le timing n'est pas crucial (affichage, écriture dans un fichier...)

    Cette architecture permettra d'éviter par exemple qu'un délai dans l'affichage (parce que l'utilisateur est ent rain de bouger une fenêtre, ou qu'un antivirus scanne un fichier) n'ait un impact trop important sur la tâche qui doit vraiment avoir lieu à fréquence bien définie.
    merci pour l'idée Loic, je vais tenter de créer 2 threads !!

  7. #7
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    +1 avec Loïc, bien que deux processus ne soient pas nécessaires sous Windows (un thread RT suffit bien amplement).

    J'aurais tendance à faire trois étages, pour ma part :
    1. Un thread de lecture depuis le fichier.
    2. Un thread de "log" muet, ne faisant en fait que consigner la liste des évènements.
    3. Un thread de MAJ du contrôle d'affichage.
    4. Le reste de l'appli (thread principal, d'IHM, ...).
    Le thread 1 écrit (uniquement) dans les données du thread 2, et le thread 3 ne fait que lire dans les données du thread 2.

    Les réglages de priorité seront plus faciles à faire avec trois étages, et en se débrouillant bien, il est carrément possible de faire du lock-free.

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    +1 avec Loïc, bien que deux processus ne soient pas nécessaires sous Windows (un thread RT suffit bien amplement).
    En effet, en direct, ça ne sert à rien. Si j'ai mentionné cette possibilité, c'est parce que, si jamais la ponctualité du système n'est pas suffisante (ce dont je doute ici), il peut être utile d'évoluer avec comme architecture un noyau temps réel qui tourne en dessous de windows (j'avais utilisé WinRT à une époque), et dans ce cas une architecture à deux processus devient obligatoire.

  9. #9
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Effectivement, c'est requis avec un co-noyau. Toutefois, sur une machine moderne, il serait étonnant d'avoir à en venir à cette solution pour quelque chose qui arrive toutes les 250 ms, ce qui reste une base de temps "lente" pour Windows. Cela pourrait être différent avec une période proche du quantum de temps par défaut, bien entendu.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Est-ce que vous savez où je peut trouver de l'info sur la création de thread sur Visual MFC? J'ai jamais fait...

  11. #11
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Dans le tutoriel API Win32, notamment, et dans la FAQ VC++.

    Attention, toutefois, si tu utilises les MFC : il faut alors utiliser les fonctions dédiées des MFC (classe CThread notamment), et non pas les fonctions "de base" qui ne te permettraient pas d'utiliser les MFC correctement.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Un problème subsiste toujours....Puisque mon fichier texte se construit au fur et à mesure de l'entrée des données (à toutes les 250ms) , comment faire pour synchroniser le déclenchement du fichier texte (qui est indépendant et donc sur lequel je n'ai pas de contrôle en soit, puisqu'il est fournit par un autre logiciel (Portmon de Microsoft)et dont je n'ais pas les codes sources) avec mon programme C++...

    C'est-à-dire, comment faire pour qu'il y ait une cohérence entre le temps auquel nos données sont affichés et celui auquel les données sont inscrites sur le fichier texte?

    Je pensais trouver dans un premier temps le end of file du fichier, ajouter un timer qui lui dit d'attendre 250 ms avant de continuer sa lecture...est-ce possible tout ça ?? Sinon avez-vous des idées ??

    Merci, c'est grandement apprécié !!

  13. #13
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 534
    Points : 6 723
    Points
    6 723
    Par défaut
    Bonjour,

    à partir du moment où le producteur du fichier est un outil tier que vous ne pouvez pas modifier, la seule solution est effectivement de tester périodiquement s'il y a quelque chose de nouveau. L'API des fichiers n'offre pas de lecture bloquante comme c'est par exemple le cas pour un socket

    pour savoir si vous devez réouvrir le fichier à chaque test ou si vous pouvez toujours utiliser le même descripteur le mieux est finalement d'essayé, car vous ne savez pas vraiment comment le fichier est mis à jour par le programme tier, et éventuellement comment la lecture gère son cache. En cas de doute réouvrez le fichier à chaque fois. Bien evidemment si vous réouvrez le fichier à chaque fois il ne faut pas bettement relire la partie déjà lue mais directement sauter au bon offset (genre lseek)

    le problème suivant sera de décider quand arreter d'essayer de lire dans le fichier (sans doute via un arret de votre application)

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Win32 propose une API pour monitorer un répertoire (dont le changement de taille d'un fichier). Je ne sais pas si ça a la réactivité nécessaire, mais ça peut être une piste à tester. Doc MSDN : Directory Notification.

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    J'ai trouvé une façon de changer la position de mon curseur dans mon fichier texte, soit a chaque séquence d'entrée de données, puisque celle-ci est fixe (24 trames ou lignes par séquence). Donc, j'utilise une boucle qui ouvre et ferme le fichier à chaque 250 ms, et je trouve la position de mon curseur a la fin de chaque séquence, afin que cette position soit connu pour la lecture de la prochaine séquence...et sa marche !!!

    Mais, l'utilisation de FindFirstChangeNotification semble interessante...je vais regardre plus en détails!

Discussions similaires

  1. graphique en temps réel :comment procéder
    Par achraf.b.a dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 18/11/2011, 13h00
  2. Traitement d'un fichier son en temps réel
    Par strattist dans le forum MATLAB
    Réponses: 0
    Dernier message: 08/11/2011, 20h07
  3. colorier texte en temps réel
    Par greg08 dans le forum Composants
    Réponses: 2
    Dernier message: 31/10/2008, 17h35
  4. Très long texte dans Quick Report - Comment faire ?
    Par delphi+ dans le forum Composants VCL
    Réponses: 2
    Dernier message: 21/08/2005, 23h18

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