Comment effectuer une actualisation de fichier?

jalmjj Messages postés 6 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 8 mai 2007 - 25 avril 2007 à 23:04
THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008 - 9 mai 2007 à 05:46
Alors voilà le problème que je n'arrive pas à résoudre (étant toujours débutant en C++).
J'ai crée un programme de réception de liaison série grâce auquel je récupère des données que j'enregistre au fur et à mesure de leur arrivé dans un fichier texte.
Mais je dois pouvoir utiliser ce fichier texte dans une autre application (un logiciel crée en MFC et C++) afin de pouvoir décodé les données présentes dans ce fichier.

Donc pour l'ouverture et l'analyse de ce fichier je n'ai aucun problème mais je voudrais mettre en place un procédé qui m'indiquerai lorsque de nouvelles données seraient mise dans le fichier texte et qui me demanderai si je souhaite ou non ré-ouvrir ce fichier afin d'avoir toutes les données contenues dans le fichier. Et j'aimerai aussi que si je réponde oui celà re-ouvre automatiquement le fichier.
Je sais que celà doit être possible vu que lorsque j'ouvre le fichier texte avec WORDPAD pour lire les données du fichier, j'ai cette fonction qui me dis que le fichier a été modifié et me demande si je veux ouvrir la nouvelle version du fichier.

Dans le cas ou personne ne serait comment faire ou que celà ne soit pas possible, est-ce qu'il est possible de mettre un simple bouton d'actualisation (sans messages qui previendrait d'une modification dans le fichier) comme celui pour actualiser une page internet???

Merci d'avance pour votre aide et vos réponses.

7 réponses

THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008
26 avril 2007 à 00:11
Peut-etre en comparant regulierement la date de modification du fichier? (cf GetFileAttributes)

<endl>< body></endl>
jalmjj Messages postés 6 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 8 mai 2007
3 mai 2007 à 22:33
Merci pour ta réponse et ton aide THEwarrior333.
J'ai en effet regarder comment utiliser la GetFileAttributes et en effectuant une comparaison entre la date de la derniere modification du fichier et celle à un moment ultérieur je peux voir si il y a eu un rajout de données. Et dans ce cas, je mets la nouvelle date comme base pour la prochaine comparaison car j'ai mis cette comparaison dans la boucle me servant pour la réception de données via le port serie.
Je peux donc maintenant savoir quand a lieu un changement dans mon fichier.

Dans un deuxième temps, et comme j'aimerais prévenir l'utilisateur que le fichier a subit des modifications, j'ai utilisé la fonction MessageBox [MessageBox(0,date,"Le fichier a été modifié",MB_ICONWARNING);
] pour faire apparaître un message prévenant qu'une mise à jour du fichier a été faite. Mais a priori tant que je n'ai pas validé la fenêtre qui apparait le programme ne passe pas à l'exécution de la ligne de code suivante. J'aimerai donc savoir si il existe un moyen pour faire apparaître une fenêtre avec mon message et que celles-ci n'empêche pas la poursuite de l'exécution du programme (plus simplement faire une fenêtre qui ne fasse que afficher ma phrase comme on peut le faire avec un "cout").
THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008
4 mai 2007 à 01:11
MessageBox est en effet un evenement bloquant, c'est a dire qu'il interrompt l'execution du programme.
Tu as plusieurs solutions pour y remedier:
- soit tu réalises une fenetre d'interface (peut etre est-ce deja fait?) en API windows. Il suffit alors dans celle-ci d'intégrer un contrôle tel qu'un static box par exemple qui recevra le texte d'avertissement.
- soit tu crées un thread (si tu ne sais pas ce que c'est dis le moi) qui s'occupe uniquement de savoir si ton fichier est mis ou jour et d'avertir quand c'est le cas. Créer et gérer les threads est moins évident que de créer un simple fenetre mais c'est tout a fait envisageable.

La premiere solution me semble etre la plus adaptée à ton probleme mais n'ayant pas tous les details de ton projet ce n'est pas sûr non plus.
jalmjj Messages postés 6 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 8 mai 2007
7 mai 2007 à 00:24
Encore merci pour ta réponse.
Non, je ne connais pas le thread (mais j'ai cru comprendre que c'etait un element bien utile, qui servait assez souvent en programmation). Je ne connais pas non plus l'API windows.

Sinon ben par rapport a mon projet et ma question de départ, ben en fait j'ai  d'un côté un programme qui réceptionne des données par la liaison série et qui les sauvegardes dans des fichiers textes. Et d'un autre côté, j'ai un logiciel que j'ai récupéré (écrit en MFC et C++ ) qui me permet d'analyser et de traités les données que je reçoit. En observant le programme code du logiciel j'ai réussi a mettre un lien dans la barre de tâche qui me permet de lancer le fichier éxecutable de mon programme de réception de la liaison série. Et donc, en fait là je voudrais avoir un message qui s'affiche sur l'écran pour me dire quand le fichier de reception est modifie, donc juste besoin d'afficher un simple message lorsque je detecte un changement (en procédant comme tu me l'as conseillé avec une comparaison de la date de modification du fichier).

Pour ce qui est de ma premiere requete de mise a jour, ben je pense que je vais mettre en place un bouton dans la barre de tache qui m'ouvrira le fichier dont j'aurais specifier le nom. Et pour ce nom ben je lui donnerai celui du fichier qui est dejà ouvert, car comme lorsque un fichier est ouvert par le logiciel son mon est affiché, je pense que je dois pouvoir le récupérer et donc le réutiliser pour réouvrir le fichier.

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008
7 mai 2007 à 06:39
En deux mots pour les definitions:
- un thread est l'execution en parallele d'une partie d'un code. Pour te donner une idée: la copie de fichiers sous windows utilise deux threads: un pour faire la copie proprement dite et un pour afficher l'animation de copie.
Si l'animation et la copie se faisaient sous un meme thread, l'animation serait figée ou tres saccadée.
Il y a des bons tutos sur le net. Tu peux deja regarder celui-la: http://www.codeproject.com/threads/Threads_1.asp
- l'API windows est la librairie permettant d'utiliser les fonctions windows telles que l'affichage de fenetres, de controles, l'utilisation de threads justement, etc... D'ailleurs MFC est en fait une sur-couche (une vraie usine à gaz d'ailleurs) de cette API, c'est à dire un ensemble de classes dont le but est (soit-disant) de simplifier la programmation windows.

Bref dans ton cas si je comprend bien, tu as la possibilité au moment du click sur le bouton de lancer un thread exécutant ton programme. Ainsi une fois ton programme lancé, meme s'il s'interrompt pour avertir d'une mise à jour, le programme de traitement (celui que tu as recupéré) continue d'intéragir avec l'utilisateur. Cependant, tant que l'utilisateur n'a pas validé le MessageBox, ton programme attendra. Est-ce ce que tu souhaites?
Si en fait tu souhaites que ton programme récupère sans cesse les données et ne soit jamais interrompu lors du MessageBox, alors le thread doit etre lancé au niveau de ton programme ce qui, en résumé, fait que ton programme s'execute en deux threads qui communiquent entre eux:
- un contenant la boucle de reception des données et qui envoie un message à l'autre thread pour l'avertir d'une mise à jour.
- un deuxieme qui contient la boucle de réception des messages du premier thread et affichant un MessageBox lorsque le premier thread lui en donne l'ordre.

Sinon puisque tu as pu comprendre un peu le fonctionnement de l'interface en MFC, peut-etre arriverais-tu à y intégrer une zone de texte statique recevant les messages de mise à jour...A ce moment la ca simplifie les choses car tu n'as peut-etre plus besoin de threads.

Pour ce qui est du nom du fichier ouvert, s'il est affiché par l'interface alors oui biensur tu dois pouvoir le récupérer.
jalmjj Messages postés 6 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 8 mai 2007
8 mai 2007 à 21:49
"Bref dans ton cas si je comprend bien, tu as la possibilité au moment du click sur le bouton de lancer un thread exécutant ton programme. Ainsi une fois ton programme lancé, meme s'il s'interrompt pour avertir d'une mise à jour, le programme de traitement (celui que tu as recupéré) continue d'intéragir avec l'utilisateur. Cependant, tant que l'utilisateur n'a pas validé le MessageBox, ton programme attendra. Est-ce ce que tu souhaites?"

Je ne sais pas si cela est un thread mais j'ai utilisé la fonction shellexecute (que j'ai trouvé en cherchant dans l'aide du logiciel Microsoft Visual C++). Sinon tu as raison mon programme attend que je valide le messagebox et c'est justement ceci que je veux éviter car cela a pour effet de me faire perdre des données lors de ma réception par la liaison serie.
Sinon si j'ai bien compris ce que tu voulais dire avec des threads on peut en quelques sortes faire fonctionner deux programmes en parrallèle? Si c'est le cas cela conviendrait parfaitement a mon problème donc je vais lire le tuto sur le lien que tu as mis et essayé de comprendre comment ça marche.
Et concerant le nom du fichier que je veux récupérer, oui il s'affiche sur l'interface du logiciel avec d'autres informations et c'est pour ça que j'ai penser que je pouvais sûrement le récupérer, il me faut juste un peu de temps pour comprendre ou se situe les informations dans le code du logiciel ^^.
Encore merci pour toutes tes réponses.
THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008
9 mai 2007 à 05:46
En fait un thread n'est pas vraiment l'execution de deux programmes en parallèle: tu crées un thread à l'intérieur d'un programme pour faire fonctionner une partie du code (des fonctions) en parallèle.
ShellExecute convient pour lancer ton exécutable à partir du logiciel. Il ne résoud pas ton probleme car tu dois créer un thread dans ton programme, pour le contrôle du flot de données sans quoi chaque apparition du MessageBox bloquera l'exécution de ton programme.
Rejoignez-nous