void FastGameInSecondThread() { var state = _currentStateInSecondThread; while (!state.IsFinished) { Turn firstPlayerTurn = GetTurnFromProgramExecuter(state, state.players[0]); Turn secondPlayerTurn = GetTurnFromProgramExecuter(state, state.players[1]); SimultaneousTurn turn = new SimultaneousTurn(); turn.FirstPlayerTurn = firstPlayerTurn; turn.SecondPlayerTurn = secondPlayerTurn; //записываем ход и проигрываем его, чтоб можно было дальше программы вызывать _engine.DoTurn(ref state, turn); recordedTurns.TryAdd(state.turn, turn); state.turn++; if (state.turn == Const.NumberOfTurns) { state.IsFinished = true; } } //сохраним игру полностью string file = startTime.ToString("yy-MM-dd-hh-mm-ss") + "-" + (state.players[0].programAddress == null ? "человек" : Path.GetFileNameWithoutExtension(state.players[0].programAddress)) + "-" + (state.players[1].programAddress == null ? "человек" : Path.GetFileNameWithoutExtension(state.players[1].programAddress)) + "-" + state.players[0].Score.ToString() + "-" + state.players[1].Score.ToString(); bool success = TrySaveReplay(Application.StartupPath + "\\..\\Replays\\" + file + ".rpl"); ExternalProgramExecuter.DeleteTempSubdir(); }
void FastGameInSecondThread() { var state = _currentStateInSecondThread; int turnWithExceptionCount = 0; GameForm.GameInSecondThreadIsRunning = true; while (!state.IsFinished) { Turn firstPlayerTurn = GetTurnFromProgramExecuter(state, state.players[0]); if (firstPlayerTurn != null && firstPlayerTurn.TurnStatus == ExternalProgramExecuteResult.InternalError) { turnWithExceptionCount++; } Turn secondPlayerTurn = GetTurnFromProgramExecuter(state, state.players[1]); if (secondPlayerTurn != null && secondPlayerTurn.TurnStatus == ExternalProgramExecuteResult.InternalError) { turnWithExceptionCount++; } bool stopGame = GameForm.UserWantsToClose; if (turnWithExceptionCount >= 2) { var dialogResult = MessageBox.Show("Внешняя программа несколько раз завершилась с ошибкой. Остановить игру? Да = остановить, Нет = продолжить до следующей ошибки, Отмена = продолжить до конца игры, не обращая внимания на ошибки", "Внимание", MessageBoxButtons.YesNoCancel); if (dialogResult == DialogResult.No) { turnWithExceptionCount = 1; } else if (dialogResult == DialogResult.Yes) { stopGame = true; } else { turnWithExceptionCount = -1000000; } } SimultaneousTurn turn = new SimultaneousTurn(); turn.FirstPlayerTurn = firstPlayerTurn; turn.SecondPlayerTurn = secondPlayerTurn; //записываем ход и проигрываем его, чтоб можно было дальше программы вызывать _engine.DoTurn(ref state, turn); recordedTurns.TryAdd(state.turn, turn); state.turn++; if (state.turn == Const.NumberOfTurns || stopGame) { state.IsFinished = true; } } Thread.Sleep(500); //чтобы удалить темп, надо подождать, пока программы отдадут права на редактирование директории GameForm.GameInSecondThreadIsRunning = false; //сохраним игру полностью string file = startTime.ToString("yy-MM-dd-hh-mm-ss") + "-" + (state.players[0].programAddress == null ? "человек" : Path.GetFileNameWithoutExtension(state.players[0].programAddress)) + "-" + (state.players[1].programAddress == null ? "человек" : Path.GetFileNameWithoutExtension(state.players[1].programAddress)) + "-" + state.players[0].Score.ToString() + "-" + state.players[1].Score.ToString(); bool success = TrySaveReplay(Application.StartupPath + "\\..\\Replays\\" + file + ".rpl"); ExternalProgramExecuter.DeleteTempSubdir(); }