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

C++ Discussion :

attendre qu'un fichier soit modifier


Sujet :

C++

  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    76
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 76
    Par d�faut attendre qu'un fichier soit modifier
    Bonjour,

    je souhaite cr�er une fonction nouvelles_donnees(const string&); qui attend que de nouvelle donn�es soit �critent dans le fichier puis me les renvoie.
    Mais pendant que la fonction attend, il ne faut pas que les ressources soit intens�ment utilis�, c'est � dire pas avec un violent while(true){...}

    sauf que je n'est pas la moindre id�e de la fa�on dont je pourrai faire �a :s

    par hasard, il existe pas une lib toutes pr�tes qui ferai �a ??

    rmq: les donn�es sont �crites par un autre programme, dont je pense pas que les mutex et autre s�maphore puissent m'aider.
    par contre, s'il est possible de dire "je veux que tu lance `tel` fonction lorsque un programme externe � �crit dans `ce` fichier" �a me va aussi bien


    merci, mathieu

  2. #2
    Membre exp�riment�
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    D�tails du profil
    Informations personnelles :
    �ge : 45
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Par d�faut
    Il suffit de faire du pulling...

    Par exemple, toutes les 5 secondes, tu ouvres le fichier et tu verifies ce qu'il y a dedant.

  3. #3
    Membre confirm�
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    76
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 76
    Par d�faut
    j'avais pas pr�cis�, mais c'est justement ce que je cherche � �viter ^^

  4. #4
    Membre exp�riment�
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    D�tails du profil
    Informations personnelles :
    �ge : 45
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Par d�faut
    Il n'existe pas, � ma connaissance, d'indicateur pour te dire que le fichier a �t� modifi�... D'une mani�re ou d'une autre, le pulling semble �tre in�vitable.

    Tu n'es peut-�tre pas oblig� de v�rifier tout le fichier. Peut-�tre que la derni�re date de modification suffit

    Si c'est la consommation CPU qui t'inqui�te, tu peux tr�s bien armer un timer qui ex�cute ta fonction de v�rification toutes les x secondes... pendant ce temps, si c'est bien fait, tu ne consommes rien...

  5. #5
    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 : 51
    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
    Par d�faut
    Je ne sais pas pour les unix, mais les windows permettent de mettre en place une notification quand un fichier est modifi�. En .NET, je crois que ce serait la classe FileSystemWatcher, en Win32, des trucs genre FindFirstChangeNotification.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  6. #6
    Membre confirm�
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    76
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 76
    Par d�faut
    a�e, pas cool �a...

    parce que je pens� faire qqch qui r�agisse instantan�ment, je pourrai bien baisser la dur�e du timer, mais comme il risque d'y avoir beaucoup de processus en m�me temps, je suis pas sur que �a le fasse...

    et par exemple, kdevellop, il pr�viens quand le fichier est supr ou modifier par une source externe, il fait du pulling?

    edit:
    @JolyLoic: thx, je vais chercher des infos la dessus, des fois que quelque part ils parlent d'un �quivalent unix ^^

  7. #7
    Membre exp�riment�
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    D�tails du profil
    Informations personnelles :
    �ge : 45
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Par d�faut
    parce que je pens� faire qqch qui r�agisse instantan�ment, je pourrai bien baisser la dur�e du timer, mais comme il risque d'y avoir beaucoup de processus en m�me temps, je suis pas sur que �a le fasse...
    Tu peux baisser le timer a 100ms par exemple... �a ne posera pas de pb je pense. Ne descent pas en dessous des 10ms par contre... tu risquerais d'avoir des surprises.

    et par exemple, kdevellop, il pr�viens quand le fichier est supr ou modifier par une source externe, il fait du pulling?
    Je pense oui... Meme pour la fonction FindFirstChangeNotification je pense que �a marche comme �a en interne. Je me trompe peut-etre mais je ne vois pas comment �a pourait marcher autrement...

    Edit : Si une �me eclair� saurai me confirmer ou nous en dire +

  8. #8
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    FindFirstChangeNotification(), �a m'�tonnerait que ce soit du pulling (ce serait pas plut�t polling ?), puisque c'est directement g�r� par le kernel.

    Une ChangeNotification est un objet de synchronisation du kernel, donc je pense que le kernel "signale" l'objet d�s qu'il touche � un fichier que l'objet surveille.
    Et comme tout objet de synchronisation, d�s qu'il est "signal�", tout thread qui l'attend (avec WaitForSingleObject()) est r�veill� "instantan�ment"...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre exp�riment�
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    D�tails du profil
    Informations personnelles :
    �ge : 45
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Par d�faut
    C'est un peu magique tout �a

    Ca marcherai donc un peu comme pour les conditions dans boost::thread::condition ?

    Excuse moi si je parle en boost...

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    boost::condition cond; // une condition
    ...
    scoped_lock lock(mutex);
    cond.wait(lock); // attente de la condition
    ...
    cond.notify_one(); // notification
    �a veux dire que toute action, aussi minime qu'elle soit, est notifi�e ? que quelqu'un l'attende ou pas ? �a n'est pas un peu lourd ?

    Je suis p'tetre trop curieux

  10. #10
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Ben, le kernel est forc�ment au courant puisque c'est lui qui touche aux fichiers, et si un objet ChangeNotification existe, il regarde si l'objet en question n'est pas r�gl� pour surveiller ledit fichier...

    FindFirstChangeNotification() cr�e l'objet.
    FindNextChangeNotification() resette l'objet (il repasse de "signal�" � "non-signal�" pour qu'on puisse � nouveau l'attendre).
    WaitForSingleObject() et ses soeurs permettent au thread appelant d'attendre que l'objet soit signal�.
    Et toutes ces fonctions sont directement support�es par le Kernel de Windows et export�es par Kernel32.dll

    Et je suis d�sol� pour les threads de boost, je ne les connais pas. Je ne sais m�me pas si l'impl�mentation Win32 de boost utilise les fonctions d'attente de Windows...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre exp�riment�
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    D�tails du profil
    Informations personnelles :
    �ge : 45
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Par d�faut
    J'ai un peu de mal avec les fonctions de l'API... Mais c'est interessant
    Comment fait on pour assurer la portabilit� si on est oblig� de passer par ces fonctions ?
    En tout cas, merci pour ces infos Medinoc, il va falloire que je creuse
    Je meterai bien mais �a n'est pas mon post � la base
    Si tu as des questions sur boost un jour... n'hesite pas

  12. #12
    Membre confirm�
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    76
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 76
    Par d�faut
    ouai, on fait comment pour la portabilit�? parce que je trouve pas grand chose pour unix

    et sinon, pour en revenir au p[uo]lling, es ce que c'est jouable a votre avis si j'ai par exemple 300 processus qui font �a en m�me temps (sureveillant chacun un fichier)?

  13. #13
    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 : 51
    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
    Par d�faut
    Perso, je pr�f�rerais un processus qui surveille 300 fichiers.

    Pour l'existance d'une fonction de notification de ce genre sous unix, peut-�tre en contactant un forum sp�cialis� unix plut�t qu'un forum C++ ?

    Pour comment faire du portable, bien c'est simple, tu d�finis toi m�me une interface ind�pendante du syst�me (�ventuellement en t'appuyant sur boost::thread ou boost::signal), et tu l'impl�mentes diff�remment pour chaque OS concern�. Puis tu la proposes � boost si tu en as le droit/l'envie...
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  14. #14
    Membre confirm�
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    76
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 76
    Par d�faut
    j'pr�fererai aussi un programme qui surveille 300 fichiers, mais en fait, mon programme c'est pour faire tourner en cgi sur un serveur apache, chaque utilisateur loggu� sera connect� avec un processus du coup

    bon, j'vais demander sur le forum unix

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. supprimer fichiers non modifi�s depuis X jours
    Par tyrax dans le forum Langage
    R�ponses: 2
    Dernier message: 17/05/2006, 18h10
  2. [C#] Attendre que l'application soit lanc�e ?
    Par choas dans le forum Windows Forms
    R�ponses: 5
    Dernier message: 09/05/2006, 21h39
  3. Comment savoir qu'un fichier est modifie
    Par moniphal dans le forum Langage
    R�ponses: 2
    Dernier message: 02/10/2005, 10h26
  4. Attendre qu'un thread soit suspendu !
    Par pi05 dans le forum MFC
    R�ponses: 1
    Dernier message: 24/06/2005, 10h58
  5. [API Windows]Attendre qu'une fenetre soit dessinee
    Par VoLc0m dans le forum Windows
    R�ponses: 21
    Dernier message: 13/05/2005, 15h11

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