Exécution d'un code toutes les X secondes
Fermé
Kuartz
Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
-
3 août 2016 à 16:05
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 - 8 août 2016 à 22:11
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 - 8 août 2016 à 22:11
A voir également:
- Exécution d'un code toutes les X secondes
- Code asci - Guide
- Code puk bloqué - Guide
- Code telephone oublié - Guide
- Code activation windows 10 - Guide
- Direct x runtime - Télécharger - Pilotes & Matériel
2 réponses
Hydr0s
Messages postés
1678
Date d'inscription
lundi 24 janvier 2011
Statut
Membre
Dernière intervention
24 août 2022
679
Modifié par Hydr0s le 3/08/2016 à 16:10
Modifié par Hydr0s le 3/08/2016 à 16:10
Avec
une petite boucle while et un truc pour sortir...
Trust me and keep calm, I'm an engineer !
#include <windows.h> sleep(5000);//ms
une petite boucle while et un truc pour sortir...
Trust me and keep calm, I'm an engineer !
Kuartz
Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
61
5 août 2016 à 11:02
5 août 2016 à 11:02
Du coup voici ce que j'ai écrit :
Sauf qu'en exécutant la macro, j'ai un écran noir qui ne part pas. Si je retourne dans mon fichier texte toutes les 5 secondes, le true n'est pas modifié en false (il l'est que bien plus tard). Et il m'est également impossible de quitter l'exécution même en quittant le processus !
Cordialement.
#include <stdio.h> #include <windows.h> int remplacer_true_par_false(char* nom_lecture) { FILE* lecture = fopen(nom_lecture, "r"); if (lecture == NULL) return 1; const char* const nom_ecriture = tmpnam(NULL); FILE* ecriture = fopen(nom_ecriture, "w"); if (ecriture == NULL) return 1; int c; while ((c = fgetc(lecture)) != EOF) { if (c == 't') { char suite[4] = ""; fgets(suite, 4, lecture); if (suite[0] == 'r' && suite[1] == 'u' && suite[2] == 'e') fputs("false", ecriture); else { fseek(lecture, -3, SEEK_CUR); fputc(c, ecriture); } } else fputc(c, ecriture); } fclose(lecture); fclose(ecriture); remove(nom_lecture); rename(nom_ecriture, nom_lecture); } int main(void) { int x = 0; while (x < 12); { remplacer_true_par_false("J://TRANSMISSION//Emis//freteurope//Emis//VIRSEPABNP.XML"); remplacer_true_par_false("J://TRANSMISSION//Emis//Transeurope cj//Emis//VIRSEPABNP.XML"); remplacer_true_par_false("J://TRANSMISSION//Emis//Romfreight//Emis//VIRSEPABNP.XML"); x++; sleep(5000); } return 0; }
Sauf qu'en exécutant la macro, j'ai un écran noir qui ne part pas. Si je retourne dans mon fichier texte toutes les 5 secondes, le true n'est pas modifié en false (il l'est que bien plus tard). Et il m'est également impossible de quitter l'exécution même en quittant le processus !
Cordialement.
paly2
Messages postés
254
Date d'inscription
vendredi 29 août 2014
Statut
Membre
Dernière intervention
15 février 2018
25
7 août 2016 à 22:19
7 août 2016 à 22:19
Il ne faut pas mettre de point-virgule après un while (sinon il ne prend pas en compte le bloc qui le suit et boucle en répétant uniquement la condition, ce qui est très pratique dans certains cas mais n'est pas le comportement voulu ici), c'est seulement après les do...while qu'il en faut un, mais à part ça ta boucle est bonne!
De plus, il ne faut surtout pas modifier un fichier sur lequel un autre programme écrit en même temps, cela entraîne des situations farfelues à cause du parallélisme (il y a de nombreux articles là dessus si ça t'intéresse, cherche "exclusions mutuelles" (ou "mutex") sur ton moteur de recherche).
De plus, il ne faut surtout pas modifier un fichier sur lequel un autre programme écrit en même temps, cela entraîne des situations farfelues à cause du parallélisme (il y a de nombreux articles là dessus si ça t'intéresse, cherche "exclusions mutuelles" (ou "mutex") sur ton moteur de recherche).
paly2
Messages postés
254
Date d'inscription
vendredi 29 août 2014
Statut
Membre
Dernière intervention
15 février 2018
25
Modifié par paly2 le 8/08/2016 à 08:08
Modifié par paly2 le 8/08/2016 à 08:08
Oups je n'ai pas vu qu'il y a une petite erreur dans ta boucle: tu fais commencer x à 0 et boucles tant qu'il est inférieur à 12. Tu boucles donc pour toutes les valeurs de x de 0 à 11, c'est-à-dire 12 fois (or tu ne veux boucler que 11 fois). C'est donc x<11 qu'il faut mettre comme condition.
Kuartz
Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
61
>
paly2
Messages postés
254
Date d'inscription
vendredi 29 août 2014
Statut
Membre
Dernière intervention
15 février 2018
8 août 2016 à 09:51
8 août 2016 à 09:51
Bonjour paly 2,
Je te remercie infiniment pour toutes tes explications. C'est très sympa de m'aider et tu le fais bien.
"De plus, il ne faut surtout pas modifier un fichier sur lequel un autre programme écrit en même temps, cela entraîne des situations farfelues à cause du parallélisme (il y a de nombreux articles là dessus si ça t'intéresse, cherche "exclusions mutuelles" (ou "mutex") sur ton moteur de recherche)."
Je ne comprend pas ce que tu entends exactement par là. Tu veux dire que personne ne pourra ouvrir le fichier pendant l'exécution du code? Parce que normalement si le programme s'éxécute toutes les 5 secondes et ferme le fichier texte après s'être exécuté, alors normalement aucun programme n'écrira en même temps sur le fichier texte. Je me trompe?
Cordialement.
Je te remercie infiniment pour toutes tes explications. C'est très sympa de m'aider et tu le fais bien.
"De plus, il ne faut surtout pas modifier un fichier sur lequel un autre programme écrit en même temps, cela entraîne des situations farfelues à cause du parallélisme (il y a de nombreux articles là dessus si ça t'intéresse, cherche "exclusions mutuelles" (ou "mutex") sur ton moteur de recherche)."
Je ne comprend pas ce que tu entends exactement par là. Tu veux dire que personne ne pourra ouvrir le fichier pendant l'exécution du code? Parce que normalement si le programme s'éxécute toutes les 5 secondes et ferme le fichier texte après s'être exécuté, alors normalement aucun programme n'écrira en même temps sur le fichier texte. Je me trompe?
Cordialement.
paly2
Messages postés
254
Date d'inscription
vendredi 29 août 2014
Statut
Membre
Dernière intervention
15 février 2018
25
>
Kuartz
Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
8 août 2016 à 22:11
8 août 2016 à 22:11
Si l'exécution du programme commence alors que l'exécution du programme qui génère tes fichiers XML n'est pas terminée, il y aura deux programmes qui écriront en même temps.
C'est très problématique. Par exemple (j'appelle "ton programme" celui dont il y est question ici, et "le logiciel" le programme qui génère les fichiers), si ton programme s'exécute plus vite que le logiciel, à la fin de son exécution (c'est-à-dire, lorsqu'il rencontre la fin du fichier, un fin d'ailleurs qui ne sera plus fin dès que le logiciel écrira la suite) il supprimera le fichier sur lequel le logiciel est en train d'écrire. Le comportement alors des fonctions d'écriture dans le fichier (appelées depuis le logiciel) est variable et indéfini, d'autant plus que le fichier est remplacé par le nouveau fichier avec les false au lieu des true (ce qui décale des caractères car "false" fait une lettre de plus que "true"). Et même si c'est le logiciel qui s'exécute plus vite, rien ne garantit que le fichier écrit par le logiciel soit à jour dans ton programme avant qu'il ne soit fermé par le logiciel (fonction fclose()), ce qui revient au même problème (ton programme rencontrera la fin du fichier avant que le logiciel aie eu le temps de tout écrire).
Pour éviter qu'un programme ouvre un fichier qui est déjà ouvert dans un autre programme (la section du programme pendant laquelle le fichier est ouvert est appelée "zone critique"), les programmeurs ont inventé des variables spéciales qui s'appellent les mutex (MUTual EXclusion, exclusion mutuelle en anglais). Mais c'est assez compliqué à gérer.
Bref, ce n'est pas grave si tu ne comprends pas tout, en tout cas, croie-moi (et tous les programmeurs te diront la même chose), il faut que tu puisses avoir la certitude que jamais ton programme ne se lancera avant que le logiciel aie terminé son exécution (ou l'inverse, que le logiciel se lance avant que ton programme aie terminé son exécution).
C'est très problématique. Par exemple (j'appelle "ton programme" celui dont il y est question ici, et "le logiciel" le programme qui génère les fichiers), si ton programme s'exécute plus vite que le logiciel, à la fin de son exécution (c'est-à-dire, lorsqu'il rencontre la fin du fichier, un fin d'ailleurs qui ne sera plus fin dès que le logiciel écrira la suite) il supprimera le fichier sur lequel le logiciel est en train d'écrire. Le comportement alors des fonctions d'écriture dans le fichier (appelées depuis le logiciel) est variable et indéfini, d'autant plus que le fichier est remplacé par le nouveau fichier avec les false au lieu des true (ce qui décale des caractères car "false" fait une lettre de plus que "true"). Et même si c'est le logiciel qui s'exécute plus vite, rien ne garantit que le fichier écrit par le logiciel soit à jour dans ton programme avant qu'il ne soit fermé par le logiciel (fonction fclose()), ce qui revient au même problème (ton programme rencontrera la fin du fichier avant que le logiciel aie eu le temps de tout écrire).
Pour éviter qu'un programme ouvre un fichier qui est déjà ouvert dans un autre programme (la section du programme pendant laquelle le fichier est ouvert est appelée "zone critique"), les programmeurs ont inventé des variables spéciales qui s'appellent les mutex (MUTual EXclusion, exclusion mutuelle en anglais). Mais c'est assez compliqué à gérer.
Bref, ce n'est pas grave si tu ne comprends pas tout, en tout cas, croie-moi (et tous les programmeurs te diront la même chose), il faut que tu puisses avoir la certitude que jamais ton programme ne se lancera avant que le logiciel aie terminé son exécution (ou l'inverse, que le logiciel se lance avant que ton programme aie terminé son exécution).
3 août 2016 à 16:42
Je suis désolé mais je ne saurais pas l'adapter tel qu'il est.... Savez-vous comment faire pour que cela ne dure pas plus de 55s?
En gros le code s’exécute pendant 55s et s'arrête. Ensuite la tâche automatisée relancera 5s plus tard (tâche automatisée toutes les 1mn).
Cordialement.
Modifié par paly2 le 3/08/2016 à 18:31
La fonction que t'a donnée Hydr0s permet au programme de se "mettre en pause" pendant 5 secondes. Il suffit que tu la mettes à la fin de ta boucle pour attendre 5 secondes avant de repartir pour le prochain tour.
Note que c'est fonction n'est pas standard, et que par conséquent le programme ne fonctionnera que sous Windows.
Note: toutes les 5 secondes c'est beaucoup, surtout si les fichiers sont gros, à quoi cela te sert-il ?
3 août 2016 à 18:41
Modifié par paly2 le 3/08/2016 à 19:00
5 août 2016 à 09:57
Toutes les 5 secondes car il s'agit d'une modification dans un fichier texte qui est minime (on remplace un mot par un autre). Le code s'exécute en un temps très minime. Et il faut absolument que lorsque le fichier texte est généré par le logiciel, le mot soit remplacé très rapidement avant son utilisation. 5 Secondes me paraît bien.
Je vais essayer de coder ça tout seul, merci pour les infos :)
Cordialement.