Mit Bezug auf this programming game baue ich gerade.WPF: Zurückgeben einer Methode, nachdem eine Animation beendet wurde
Ich habe eine Klassenbibliothek (DLL), die eine Methode hat Run
, die wie so etwas zusammengesetzt sein werden:
public class MyRobot : Robot
{
public void Run(}
{
while (true)
{
Ahead(200); //moves the bot 200pixels
TurnLeft(90); //turns the bot by 90deg
}
}
}
Bei diesen Verfahren (geerbt von Robot
), wird das System der Roboter animiert Verwenden von WPF (unter Verwendung von BeginAnimation
oder DispatcherTimer
).
Nun, das Problem ist, dass ich keine Methode zurückgeben (dh, mit der nächsten Methode weitermachen) vor dem Abschluss der aktuellen, denn das wird dazu führen, dass die Animationen zusammen stattfinden, und wenn in einer unendlichen Schleife (wie die oben), das ist besonders nicht gut.
Meine Frage ist, was ist der beste Weg, um ein Verfahren von der Rückkehr vor dem Abschluss der Animation zu verhindern?
Ich habe derzeit ein bool
in der Robot
Klasse (isActionRunning
), das zu true
gekennzeichnet werden, wenn eine Aktion beginnt zu laufen und wechselt dann in false
in einer Animation Callback (das Completed
Ereignis zu verwenden, wenn mit BeginAnimation
).
Am Ende jeder Methode (nach BeginAnimation
Aufrufen) I platziert, um die folgenden Schleife:
while (isActionRunning)
{
Thread.Sleep(200); //so that the thread sleeps for 200ms and then checks again if the animation is still running
}
Dies ist so, dass das Verfahren, bevor die Animation endet nicht zurückkehren wird.
Aber ich fühle, dass dies nicht der richtige Weg ist, dies zu tun.
Kann mir jemand sagen, was das Beste ist, um dies zu erreichen?
Ausgezeichnet, das ist super. Ich habe jetzt meine Logik geändert, um das zu implementieren, was Sie vorgeschlagen haben, anstelle der Schleife while (isActionRunning). –
Das ist * verrückt *. Wenn Sie warten wollen, bis ein Thread einem anderen signalisiert, dass seine aktuelle Arbeit erledigt ist, bauen Sie kein Signal aus den Sperren auf, ** benutzen Sie einfach ein Signal **. Es gibt bereits ein Objekt, das dies im Rahmen tut; benutze es einfach. http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx –
@Eric Ich erinnere mich nicht, warum ich Sperren (ich schrieb das vor einem Jahr immerhin), Es ist möglich, dass ich hatte Ein guter Grund - aber mir fällt nichts ein, also sind Signale hier wohl die richtige Lösung. Aus meiner Erfahrung sind Mutex-Locks jedoch sehr robust und vorhersehbar, während Signale jede zukünftige Codeänderung in eine schwer reproduzierbare Race-Bedingung verwandeln (ich musste einen C++ - Multi-Threading-Server unterhalten, für den Signale verwendet wurden Synchronisation - Signale haben so viele Fallstricke, dass es einfach nicht witzig ist) – Nir