Unity Chess Stockfi sh Android ошибка при звонке - PullRequest
0 голосов
/ 07 августа 2020

В Unity я пытаюсь вызвать шахматный движок stockfi sh (stockfi sh -10-armv7) из android, но получаю сообщение об ошибке (mono-io-layer-error (5)) при выполнении новый процесс во время выполнения. Сборка P C работала нормально. Движок необходимо запускать как отдельный процесс, а обмен данными осуществляется через поток ввода-вывода. Кто-нибудь знает, что это за ошибка mono-io-layer (5)? ​​

Сообщение об ошибке

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.Android;


public static class StockFish
{

    public static Process mProcess;
    public static string engineText = "";

    public static void StartEngine()
    {

        engineLog("datapath: " + Application.dataPath);        
        engineLog("Streamingpath: " + Application.streamingAssetsPath);
        engineLog("Persist path : " + Application.persistentDataPath);
        //
        string sfBin = "stockfish-10-armv7";
        string sfPathFile = Path.Combine(Application.persistentDataPath, sfBin);

        string sfPathAsset = Path.Combine(Application.streamingAssetsPath, sfBin);

        loadWeb(sfPathAsset, sfPathFile);
        if (!File.Exists(sfPathFile))
        {
            engineLog("-------FILE NOT FOUND--------------------");
            return;
        }
        else
        {
            engineLog("FILE EXISTS -------------------------------");
        }
        try
        {
            mProcess = new Process();
            ProcessStartInfo si = new ProcessStartInfo()
            {
                FileName = sfPathFile,
                UseShellExecute = false,
                CreateNoWindow = true,
                RedirectStandardError = true,
                RedirectStandardInput = true,
                RedirectStandardOutput = true
            };
            mProcess.StartInfo = si;
            mProcess.OutputDataReceived += new DataReceivedEventHandler(MProcess_OutputDataReceived);
            mProcess.Start();
            mProcess.BeginErrorReadLine();
            mProcess.BeginOutputReadLine();

        }
        catch (Exception e)
        {
            engineLog("ERROR Process:" + e.Message);
            return;
        }
        engineLog("------RUN OK----------------");
        UciCmd("uci");
        UciCmd("isready");
        //SendLine("position fen " + forsythEdwardsNotationString);
        //SendLine("go movetime 5000");


    }
    public static void loadWeb(string inFile, string outFile)
    {
        var loadingRequest = UnityWebRequest.Get(inFile);

        loadingRequest.SendWebRequest();
        while (!loadingRequest.isDone)
        {
            if (loadingRequest.isNetworkError || loadingRequest.isHttpError)
            {
                engineLog("While network error");
                break;
            }
        }
        if (loadingRequest.isNetworkError || loadingRequest.isHttpError)
        {
            engineLog("network error");
        }
        else
        {
            try
            {
                File.WriteAllBytes(outFile, loadingRequest.downloadHandler.data);
            }
            catch (Exception e)
            {
                engineLog("ERROR File Write:" + e.Message);
                return;
            }

        }
    }
    public static void engineLog(string engString)
    {
        engineText = engineText + engString + "\n";
    }
    public static void UciCmd(string command)
    {
        mProcess.StandardInput.WriteLine(command);
        mProcess.StandardInput.Flush();
    }

    private static void MProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        engineLog(e.Data.ToString());
    }


}
...