Проблемы обнаружения столкновения (Eyeshot) в массиве задач - PullRequest
1 голос
/ 05 февраля 2020

Я пытаюсь проверить каждое движение в другой задаче, и после проверки, не было ли столкновения, на некоторых итерациях генерируется исключение: «Исходная матрица не была длинной или недостаточной. Также проверьте индекс и длину. как нижние пределы матрицы ". Если вы попытаетесь запустить последовательно в «за», ошибка не происходит, мне нужно запустить параллельно, чтобы повысить производительность. В тестах отладки я замечаю, что ошибка всегда возникает при попытке запустить cd.DoWork ()

   private void btn_Tasks_Click(object sender, EventArgs e)
    {
        // The source of your work items, create a sequence of Task instances.
        Task[] tasks = Enumerable.Range(0,tabelaPosicao.Count).Select(i =>
            // Create task here.
            Task.Run(() =>
            {                    
                VerifiCollision(i);

            })

        // No signalling, no anything.
        ).ToArray();

        // Wait on all the tasks.
        Task.WaitAll(tasks);

    }
   private void VerifiCollision(object x)
    {
        int xx = (int)x;

        int AuxIncrMorsa = Convert.ToInt32(tabelaPosicao[xx].Posicao) * -1;
        bRef_BaseMorsa.Transformation = new Translation(0, AuxIncrMorsa, 0);

        CollisionDetection cd = new CollisionDetection(new List<Entity>() { bRef_BaseMorsa }, new List<Entity>() { bRef_Matriz }, model1.Blocks, true, CollisionDetection2D.collisionCheckType.OBWithSubdivisionTree, maxTrianglesNumForOctreeNode: 5);

        {
            if (cd != null)
            {
                try
                {
                     cd.DoWork();

                }
                catch (Exception e)
                {
                    e.StackTrace;
                }
                catch (AggregateException ae)
                {
                    var messege = ae.Message;
                }
            }

            model1.Entities.ClearSelection();

            if (cd3.Result != null && cd3.Result.Count > 0)
            {

              tabelaPosicao[xx].Tuple = new Tuple<string, string>(cd3.Result[0].Item1.ParentName, 
              cd3.Result[0].Item2.ParentName);

            }
         }

    }

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Я решил это путем клонирования Bloks и BlockReference, поэтому каждая итерация с ее преобразованием выполнялась отдельно, поэтому не было возможности, чтобы преобразование одной итерации мешало другой. Благодарен за помощь.

0 голосов
/ 06 февраля 2020

Перед применением преобразования вам необходимо клонировать сущность. Вы можете взглянуть на topi c of этой работы *1001* в этой статье .

...