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

JavaScript Discussion :

Écriture d'un scheduler


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Par défaut Écriture d'un scheduler
    Bonjour à tous,

    J'ai écrit une classe Scheduler, ayant pour rôle d'exécuter une fonction donnée à une heure donnée. Voilà le bestiau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    if("undefined" == typeof(Hordodo)) var Hordodo = {};
     
    //FIXME obligé de faire cette bidouille cradingue pour utiliser setTimeout()
    //ne fonctionne que si l'on a qu'une instance de Scheduler
    Hordodo.schedulerInstance = null;
     
    Hordodo.Scheduler = function(task)
    {
    	Hordodo.schedulerInstance = this;
    	this.task_ = task; //fonction à exécuter
    	this.timeout_ = null;
    	this.enabled = false;
     
    	this.process_ = function()
    	{
    		if(this.enabled) this.task_();
    		window.alert("test2");
    	};
     
    	//executionTimeStr : chaine au format HH:MM:SS
    	this.setExecutionTime = function(executionTimeStr)
    	{
    		//découpage du temps donné en heures, minutes et secondes
    		var executionTimeStrArray = executionTimeStr.split(':');
    		var executionTimeHours = parseInt(executionTimeStrArray[0]);
    		var executionTimeMinutes = parseInt(executionTimeStrArray[1]);
    		var executionTimeSeconds = parseInt(executionTimeStrArray[2]);
     
    		var currentTime = new Date();
     
    		//calcul de la date/heure où la tâche doit s'exécuter
    		var executionTime = new Date(currentTime);
    		executionTime.setHours(executionTimeHours);
    		executionTime.setMinutes(executionTimeMinutes);
    		executionTime.setSeconds(executionTimeSeconds);
    		//reporte l'exécution au lendemain si l'heure définie est dans le passé
    		if(executionTime.getTime() < currentTime.getTime())
    		{
    			executionTime.setDate(executionTime.getDate() + 1);
    		}
     
    		//calcul du temps nous séparant du moment de l'exécution
    		var executionTimeout = executionTime.getTime() - currentTime.getTime();
     
    		//programmation de la tâche
    		if(this.timeout_ != null) clearTimeout(this.timeout_);
    		this.timeout_ = setTimeout("Hordodo.schedulerInstance.process_();", executionTimeout);
     
    		window.alert("Exécution dans " + executionTimeout / 1000 + " secondes.");
    	};
    };
    Son utilisation est simple :
    - on crée une instance de Scheduler, en lui passant une fonction à exécuter ;
    - on définit une heure d'exécution (fonction setExecutionTime(), prenant une chaine HH:MM:SS), en interne la classe utilise la fonction standard setTimeout() pour programmer l'exécution de la fonction données au constructeur ;
    - on active le scheduler (via la variable membre enabled) ;
    - la fonction est exécutée.

    Au début, tout semble bien se passer. Mais au bout de plusieurs tests, le script plante : il n'est plus possible de faire exécuter quoi que ce soit au scheduler.
    Plus particulièrement, via une interface graphique (qui est le about:config de Firefox, étant donné qu'il s'agit d'une extension que je code ici, mais c'est un détail), je redéfinis à plusieurs reprises l'heure du scheduler, j'obtiens les alertes attendues (« Exécution dans X secondes »). Mais une fois que j'attends l'exécution effective de la fonction passée au scheduler, c'est à ce moment que le script plante. Plus aucune alerte ne s'affiche. C'est étrange, étant donné que la fonction passée au scheduler est une simple alerte, donc assurément sans effet de bord.

    On ne peut pas dire que j'aie un très bon niveau en JavaScript, donc ce qui m'échappe peut aussi bien être une grosse idiotie qu'une fine subtilité…
    Bref, j'attends vos réponse !
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Bonjour,
    sans aucune garantie que ça soit lié au plantage :
    il est nécessaire de préciser la base de conversion dans les fonction parseInt(), parseFloat() etc.
    Elle est normalement optionnelle est considérée en base 10 par défaut, mais un bug fait que si elle n'est pas précisée, la base est "déduite" de la valeur passée.
    Ainsi,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(parseInt('060'));
    renvoie 48
    alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(parseInt('060',10));
    renvoie 60.
    Dans le cas de gestion de dates/heures, cette erreur de conversion peut engendrer des valeurs incohérentes.

    ajoute le "10" en second paramètre des parseInt()

    A+

  3. #3
    Membre chevronné
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Par défaut
    Il n'y a pas de cas où un "060" pourrait apparaitre, vu que les nombres passés sont sur deux caractères maximums, mais il y a effectivement des "08" et "09" qui pourraient être mal digérés par parseInt().

    Hélas, j'ai testé et ça n'arrange pas les choses. D'ailleurs, j'ai placé un alert() en amont de l'exécution de la fonction setExecutionTime(), et même lui n'est plus exécuté une fois que je laisse le scheduler exécuter process().

    Quoi qu'il en soit ça règle au moins un problème potentiel, donc merci pour cette réponse E.Bzz .

    Une autre idée ?
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  4. #4
    Membre chevronné
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Par défaut
    En fait, je viens de constater qu'il n'est même pas nécessaire que le scheduler lance sa fonction programmée pour que mon script plante.
    J'ouvre Firefox, mon extension lance le scheduler (programmé pour une heure assez lointaine), je laisse passer un peu de temps sans toucher à rien… et le script est planté.
    Et je ne parviens pas à avoir le moindre message d'erreur…

    Edit : Bon, il semblerait que la partie du code incriminée soit totalement en amont, dans la partie (pourtant pas bien grosse) communiquant avec Firefox. J'ai posté sur le forum de MozillaZine…
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

Discussions similaires

  1. La mauvaise écriture nuit gravement aux performances
    Par Blustuff dans le forum OpenGL
    Réponses: 6
    Dernier message: 25/05/2004, 13h08
  2. droits en écriture sur le réseau
    Par julien20vt dans le forum MFC
    Réponses: 4
    Dernier message: 25/03/2004, 11h29
  3. [DOM] création et écriture
    Par phoebe dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 22/03/2004, 15h13
  4. [debugger] détection écriture mémoire
    Par tut dans le forum MFC
    Réponses: 3
    Dernier message: 07/01/2004, 10h17
  5. [Kylix] Simplifications de l'écriture Kylix/Pascal"
    Par Mr Vincent KLEIN dans le forum EDI
    Réponses: 1
    Dernier message: 11/03/2003, 11h07

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