Мои данные повреждены из-за многопоточности? - PullRequest
0 голосов
/ 21 февраля 2019

Я использую настройки локального сервера / клиента для тестирования программы рендеринга точек, которую я написал.Клиент правильно получает точки данных с сервера, однако из-за большого объема точек данных, которые необходимо обработать, я использовал библиотеку System.Threading.Tasks, чтобы использовать многопоточность для более быстрой обработки данных.

Вывод программы должен выглядеть следующим образом (на обработку которого в настоящее время требуется час):

Однако при использовании моего многопоточного решения это выглядит так:

Код, который я использовал для настройки многопоточности, приведен ниже (инициализация и это выполняется выше образца).

void Update () {
    //Read bytes data from server stream
    length = stream.Read(bytes, 0, bytes.Length);
    if(length != 0){    

        // Convert byte array to string message
        startedStreaming = true;
        finishedStreaming = false;
        serverMessage += Encoding.UTF8.GetString(bytes); 
    }

    else{
        finishedStreaming = true;
    }

    if(startedStreaming == true && finishedStreaming == true){
        startedStreaming = false;
        rendered = false;
        readyToProcess = false;
        StartCoroutine(DataStreaming());
    }
    if(readyToRender == true && rendered == false){
        rendered = true;
        Debug.Log("Rendering");
        pcloud.updateBuffer();
    }
}



private IEnumerator DataStreaming(){   

    //Convert bytes data to readable strings once finished receiving
    if(finishedStreaming == true && readyToProcess == false){

        if(renderer.enabled == false){
            renderer.enabled = true;
        }

        newVectors = serverMessage.Split(new char[]{'\n'} );

        Debug.Log("Message split");

        pcloud._pointData =  new PointCloudData.Point[newVectors.Length];

        readyToProcess = true;
    }

    //Convert strings into numerical values and render once finished
    if(readyToProcess == true && readyToRender == false){
        readyToRender = true;
        Debug.Log("rendering, "+ Time.realtimeSinceStartup);
        Parallel.For(0, newVectors.Length, (coord) =>{
            row = newVectors[coord].Split(new char[]{','});
            float x = int.Parse(row[0]);
            float y = int.Parse(row[1]);
            float z = int.Parse(row[2]);

            pcloud._pointData[coord].position = new Vector3((float)(x/pixelsPerUnit), (float)(y/1000f), (float)(z/pixelsPerUnit));

            pcloud._pointData[coord].color = Pcx.PointCloudData.EncodeColor(dict[(int)y]); 
        });
    }

    if(readyToRender ==  true){
        yield return new WaitForSeconds(10);
    }
}

Я предполагаю, что многопоточность как-то портит данные.Что-нибудь, что мне нужно изменить или исправить, чтобы получить правильный результат?

1 Ответ

0 голосов
/ 21 февраля 2019

Я реализовал цикл try-catch и обнаружил, что источником проблемы была одна строка поврежденных данных.По-видимому, это связано с серверной частью программы, поэтому я не буду обсуждать ее здесь в дальнейшем, но цикл try-catch был отличным решением, чтобы найти место возникновения проблемы и позволить программе продолжить работу.несмотря на возникающие ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...