Threading and minimax algo
Hi,
I'm writing a logic game in which player and CPU take turns making their move. You can think tic-tac-toe, just to make a simple example.
I've decided that the most suitable way for choosing CPU's moves is the minimax algorithm, which is recursive in nature. I've coded a first version and it seems to work, although I'll have to make it more complex for the game to offer a decent challenge.
Now, in order to keep a responsive interface while the game is choosing its move, and hopefully to be able to easily abort the calculations if the user decides to quit, I tried using C# native threading. I made a very simple implementation, using just Thread.Start, Thread.IsAlive and Thread.Abort. Something like:
waitingForAiMove = true;
aiCalculations = new Thread(EvaluateAiTurn);
aiCalculations.Start();
StartCoroutine (WaitForAi());
....
IEnumerator WaitForAi()
{
while (aiCalculations.IsAlive)
{
yield return null;
}
waitingForAiMove = false;
// handle turn logic here
}
}
public void AbortTask()
{
if (aiCalculations != null)
{
if (aiCalculations.IsAlive)
aiCalculations.Abort();
}
}
This implementation is working as expected, except that Thread.Abort doesn't seem to be working. To be able to test that, I've intentionally inserted an infinite loop at the start of the algo...a button allows me to call the Abort method, but it has no effect, and the ThreadAbortException I've added in the loop is never caught. As a matter of fact, the thread stays alive even if I stop the player and Unity hangs if i try to start it again.
Does this have to do with how Unity handles threads? Admittedly, even Microsoft suggests against using an external Abort on threads, but rather to insert a soft check of the abort condition in the thread itself. This is no easy task for a recursive algo however, and if I had to do like that I'd probably use Coroutines anyway.
Any advice, on threads or on how to handle this issue in a different way, would be much appreciated!
Answer by alejandro93 · Sep 12, 2016 at 01:18 AM
Actually i recommend you that create thread classes and check for values in update function instead of yield. You will be able to get user input for quit more clearly.
Your answer
Follow this Question
Related Questions
Turn base strategy possible move recurrsion bug 0 Answers
Increase the number of CPU cores used to build with Unity 0 Answers
I need the get the weight of all my children and add them together 0 Answers
Wait for value to not be null until thread finishes 0 Answers
Using BackgroundWorker with Unity, Completed not running on Main thread ? 1 Answer