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!