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
Bonjour,

Voici mon code :

#include <stdio.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)
{
	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");

	return 0;
}


J'ai mis cette exécution dans les tâches automatisées de Windows. Sauf que le temps est limité à 1mn. Or le code doit s’exécuter toutes les 5 secondes. Et je ne sais pas coder cela....
De plus si je met une exécution toutes les 5 secondes directement dans le code, est-ce que le fait de réexécuter ce code toutes les minutes sur le serveur ne va pas entrer en conflit avec l’exécution en cours?

Sinon la solution est peut-être d’exécuter le code toutes les 5 secondes pendant 55 secondes. Ensuite la tâche automatisée se lance 5 secondes après etc etc...

Merci d'avance pour votre aide.

Cordialement.
A voir également:

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
Avec
#include <windows.h>
sleep(5000);//ms 

une petite boucle while et un truc pour sortir...

Trust me and keep calm, I'm an engineer !
0
Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 61
3 août 2016 à 16:42
Merci beaucoup pour la réponse.

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.
0
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 3/08/2016 à 18:31
Il suffit de faire une boucle dans la fonction main dont tu limites le nombre de tours à 55÷5 = 11. Ça je suis sûr que tu peux le faire, une boucle qui boucle 11 fois (avec un compteur qui s'incrémente à chaque tour de la boucle, et la condition de la boucle pour vérifier qu'il est inférieur à 11...) :p

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 ?
0
Hydr0s Messages postés 1678 Date d'inscription lundi 24 janvier 2011 Statut Membre Dernière intervention 24 août 2022 679
3 août 2016 à 18:41
PS : CTRL+C permet d'arrêter l'exécution...
0
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25 > Hydr0s Messages postés 1678 Date d'inscription lundi 24 janvier 2011 Statut Membre Dernière intervention 24 août 2022
Modifié par paly2 le 3/08/2016 à 19:00
Seulement si le programme s’exécute au premier plan (ce qui n'est pas le cas si c'est une tâche automatisée de Windows).
0
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 à 09:57
Bonjour à tous et merci pour vos réponses.

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.
0
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
Du coup voici ce que j'ai écrit :

#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.
0
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
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).
0
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
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.
0
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
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.
0
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
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).
0