Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2016, 23:50   #1
Dimarik_1
 
Регистрация: 23.09.2016
Сообщений: 4
По умолчанию Parallel.For - обработать массив - неправильные индексы

У меня есть список objClass.listRect. В элементе списка objClass.listRect хранятся координаты области, в которой находится объект. Мне нужно выделить каждый объект и провести с ним некоторые манипуляции.
Я делаю следующим образом:
Код:
List<int> array1 = new List<int>();
 
           for (int i = 0; i < iTotalCountInParallel; i++)
            {
 
                
                int iCycle = -1;
                Parallel.For(0, iCoresCount, parOps, a =>
                {
                    iCycle++;
                    objClass.allObjects.Add(new OneObject(src, objClass.imgBinarized, objClass.listRect[a*i+a]));
                    array1.Add(a * i + a);
                });
      
            }
 
           
            //для оставшихся элементов
           int iOstatok = objClass.listRect.Count - iCoresCount * iTotalCountInParallel;
           Parallel.For(0, iOstatok, parOps, a =>
           {
               objClass.allObjects.Add(new OneObject(src, objClass.imgBinarized, objClass.listRect[a * iTotalCountInParallel + a]));
               array1.Add(a * iTotalCountInParallel + a);
           });
 
            //сохранение
           if (checkBoxSeveResults.Checked)
           {
               for (int i = 0; i < objClass.listRect.Count; i++)
               {
                   MyFilesWork.Save_jpg(i, textBoxWorkFolder.Text, objClass.allObjects[i].imgObject, objClass.allObjects[i].imgSegmentedObject);
               }
           }
           richTextBox1.Text = "";
           foreach (int v in array1)
           {
               richTextBox1.Text += v.ToString() + ";";
           }
в результате при выводе обнаруживается что некоторые одни и те же объекты были по 2-3 раза обработаны, а некоторые наоборот, обработаны не были. Вывод - проблема с индексами.
Проблема здесь objClass.listRect[a*i+a])
и здесь
[a * iTotalCountInParallel + a]
не все объекты обрабатываются. Не могу понять, почему проблема с индексами.
Нужно чтобы все учитывались. из указанного списка.
Для того чтобы окончательно убедиться что проблема именно с индексами, я все индексы сохранил в List<> и вывел их и вот результат:
1;2;4;11;8;7;3;0;9;10;6;5;2;14;4;22 ;20;8;10;0;18;12;6;16;33;12;27;21;1 5;30;3;0;9;6;24;18;20;4;16;28;8;36; 44;32;0;24;12;40;15;0;10;5;
Проблема с индексами. Что я делаю не так?
Dimarik_1 вне форума Ответить с цитированием
Старый 24.09.2016, 00:36   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

List<> не является потокобезопасным на запись, вы просто его ломаете.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 24.09.2016 в 00:39.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработать двухмерный массив ( Паскаль ) aannaayy Помощь студентам 4 07.11.2012 01:47
обработать двумерный массив Grizzz Помощь студентам 0 05.11.2012 12:46
Дан массив чисел В[0:N]. Записать подряд в массив А элементы массива В, имеющие четные индексы,(язык си++) yury.zanilov Помощь студентам 9 15.03.2012 21:55
Как Быстро Обработать Массив? loh Общие вопросы C/C++ 7 24.12.2011 01:10