En référence à this programming game Je construis actuellement.WPF: Retour d'une méthode APRÈS la fin d'une animation
J'ai une bibliothèque de classes (dll) qui aura une méthode Run
qui sera composé de quelque chose comme par exemple:
public class MyRobot : Robot
{
public void Run(}
{
while (true)
{
Ahead(200); //moves the bot 200pixels
TurnLeft(90); //turns the bot by 90deg
}
}
}
Dans ces méthodes (héritée de Robot
), le système d'animer le robot en utilisant WPF (en utilisant BeginAnimation
ou DispatcherTimer
). Maintenant, le problème est que je n'ai pas de méthode à retourner (c'est-à-dire que je passe à la méthode suivante) avant de terminer la méthode en cours, car les animations se dérouleront ensemble, et dans une infinité boucle (comme celle ci-dessus), ce n'est surtout pas bon.
Ma question est, quelle est la meilleure façon d'éviter une méthode de revenir avant la fin de l'animation?
J'ai actuellement un bool
dans la classe Robot
(isActionRunning
) qui se trouve en position de true
lorsqu'une action commence à courir, puis passe à false
dans un rappel d'animation (en utilisant l'événement Completed
si vous utilisez BeginAnimation
).
A la fin de chaque méthode (après l'appel BeginAnimation
) J'ai placé la boucle suivante:
while (isActionRunning)
{
Thread.Sleep(200); //so that the thread sleeps for 200ms and then checks again if the animation is still running
}
Il en est ainsi que la méthode ne reviendra pas avant la fin de l'animation. Mais je pense que ce n'est pas la bonne façon de le faire.
Quelqu'un peut-il me guider vers ce qu'il y a de mieux pour y parvenir?
Excellent, c'est génial. J'ai maintenant changé ma logique pour implémenter ce que vous avez suggéré, au lieu de la boucle while (isActionRunning). –
Ceci est * fou *. Si vous voulez attendre qu'un thread signale à un autre que son travail actuel est terminé, ne construisez pas un signal de verrouillage, ** utilisez simplement un signal **. Il y a déjà un objet qui fait cela dans le cadre; il suffit de l'utiliser. http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx –
@Eric Je ne me souviens pas pourquoi j'ai utilisé des verrous (j'ai écrit cela il y a un an après tout), il est possible que j'ai eu une bonne raison - mais je ne peux pas penser à tout, donc les signaux sont probablement la bonne solution ici. D'après mon expérience, les verrous de style mutex sont très robustes et prévisibles, alors que les signaux transforment chaque changement de code futur en condition de course difficile à reproduire (je devais maintenir un serveur multi-thread C++ utilisant des signaux pour synchronisation - les signaux ont tellement de pièges que ce n'est pas drôle) – Nir