2009-12-22 5 views
1

Disons qu'il est un système d'exploitation imaginaire ...Fonction pointeur Appels

Il y a une fonction qu'il a appelé settime qui obtient un pointeur de fonction et d'un horodatage. Le problème est que chaque fois que la fonction est appelée, elle est exécutée sur le dernier appel (de sorte que seule la nouvelle fonction fournie comme paramètre sera appelée).

Je veux exposer une nouvelle fonction à mes utilisateurs appelée settime2, qui permettra aux utilisateurs de l'appeler, et chronométrer une fonction sans détruire les appels précédents.

Dans l'implémentation settime2, je peux appeler settime. et getcurrenttime. et même appeler settime avec settime ou settime2 comme argument de pointeur de fonction.

Un conseil?

grâce

+1

Un pointeur vers quelle fonction? –

+1

Est-ce que "settime" a pour but de définir l'heure ou le temps nécessaire à l'exécution du pointeur de fonction? –

+1

Vous pourriez vouloir clarifier la question. –

Répondre

2

travail en supposant que la fonction qui est appelée est appelée à un moment précis ...

Que settime2 a besoin de faire est de garder une liste chaînée de pointeurs de fonction et les valeurs d'horodatage. Insérez une nouvelle valeur de fonction/horodatage dans la liste dans l'ordre de tri: la plus ancienne en premier. Utilisez settime pour configurer une fonction de gestionnaire générique et définir le délai d'expiration au plus tôt (en tête de la liste des délais).

Lorsque le gestionnaire générique est appelé, supprimez l'en-tête de la liste et appelez sa fonction. Répétez cette opération si la tête de la liste a le même horodatage.

Si la liste n'est pas vide, appelez à nouveau settime avec l'horodatage en tête de la liste. Si l'horodatage est réellement une durée (par exemple 10 msec), faites presque la même chose mais les durées enregistrées sont la somme de toutes les durées précédentes et un delta pour former la dernière durée.

Par exemple, trois appels, avec (f, 15), (g, 7), (h, 7), et (i, 20) rendrait la liste

head -> (g,7) -> (h,0) -> (f, 8) -> (i,5) 

Le premier settime serait être à 7 et g et h serait appelé. le prochain settime serait 8 après cela (un total de 15) et f appelé, et finalement après 5 plus (à 20) je serais appelé.

Veillez à gérer le changement de liste lorsqu'il est actif. ;-)

+0

Si le nombre de fonctions est très important, une liste sera une structure de données assez inefficace. Il a l'avantage que la plupart des bibliothèques ont un support direct pour cela. Si c'est important pour vous, vous pouvez vouloir utiliser un tas pour stocker les pointeurs de fonction et leurs temps associés. – Omnifarious