Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многопоточность, WaitHandler.WaitAll вызывает исключение 
V
    Опции темы
SCAR
Дата 4.1.2013, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 17.8.2006

Репутация: нет
Всего: нет



Здравствуйте, у меня возникла проблема с выполнением процессов в отдельных потоках.
Необходимо передать объекты в поток, с целью провести определенные вычисления и изменить переданные объекты.
Создаю пул потоков и получаю исключение System.NotSupportedException на WaitHandler.WaitAll.

Код

public static void fillSubPathIntersections()
        {
            int i = 0;

            ManualResetEvent[] events = new ManualResetEvent[getFactorial(SegX.Instance.getPathListCount())];

            for(int k = 0; k < SegX.Instance.getPathListCount(); k++)
            {
                Path pth1 = SegX.Instance.getFromPathList(k);
                for(int p = k + 1; p < SegX.Instance.getPathListCount(); p++)
                {
                    Path pth2 = SegX.Instance.getFromPathList(p);

                    int cur = i;
                    events[cur] = new ManualResetEvent(false);
                    
                    ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object newDelegate) { findIntersectBtwnTwoSubs(ref pth1, ref pth2, ref events[cur]); }));
                    ++i;
                }
            }
            WaitHandle.WaitAll(events);
        }


private static void findIntersectBtwnTwoSubs(ref Path pth1,ref Path pth2, ref ManualResetEvent evnt)
        {
            lock (pth1)
            {
                lock (pth2)
                {
                    Dictionary<int, SubPathA> sub1 = pth1.getSubListA();
                    Dictionary<int, SubPathA> sub2 = pth2.getSubListA();

                    foreach (KeyValuePair<int, SubPathA> i in sub1)
                        foreach (KeyValuePair<int, SubPathA> j in sub2)
                        {
                            if (((SubPathA)(i.Value)).getSegmentSize != ((SubPathA)(j.Value)).getSegmentSize && ((SubPathA)(i.Value)).getDetLevel != ((SubPathA)(i.Value)).getDetLevel) continue;
                            findSubPathIntersection(i.Value, j.Value);
                        }
                }
            }
            evnt.Set();
        }



Подскажите пожалуйста, в чем ошибка и как ее исправить?

Это сообщение отредактировал(а) SCAR - 4.1.2013, 23:27
PM MAIL   Вверх
SCAR
Дата 6.1.2013, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 17.8.2006

Репутация: нет
Всего: нет



Решил проблему при помощи класса Task:

Код

Task[] events = new Task[getFactorial(SegX.Instance.getPathListCount())];
            for(int k = 0; k < SegX.Instance.getPathListCount(); k++)
            {
                Path pth1 = SegX.Instance.getFromPathList(k);
                for(int p = k + 1; p < SegX.Instance.getPathListCount(); p++)
                {
                    Path pth2 = SegX.Instance.getFromPathList(p);

                    int cur = i;
                    events[cur] = Task.Factory.StartNew(() => findIntersectBtwnTwoSubs(ref pth1, ref pth2)); 
                                        
                    ++i;
                }
            }
            Task.WaitAll(events);



Это сообщение отредактировал(а) SCAR - 8.1.2013, 10:09
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0636 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.