|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
Приветствую. Возник такой вопрос. Задача паралельного расчета потребностей торговых точек. . Есть 6 складов с которых отгружается товар на 41 торговую точку. При запуске приложение заталкивает в ThreadPool 6*41 поток, из которых выполняются только 10. Все прекрасно работает. Однако есть но, после расчета потребнойстей, часто оказывается, что на складах товара недостаточно, поэтому после выполнения расчетов запускается поток в котором анализируются остатки по складам и, в случае нехватки, пересчитываются. Сейчас это делается после полного расчета и завершения всех потоков. Возникает вопрос, можно ли отслеживать в пуле потоки порожденные каким либо другим потоком? Т.е. сначала запускается 6 потоков расчета складов, каждый из которых ставит в пул по 41 потоку расчета потребностей торговых точек. И после отработки всех потоков по конкретному складу запускается поток анализа остатков на конкретном складе? В данный момент выглядит примерно так Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2012, 15:52 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
Crazy_WolfСейчас это делается после полного расчета и завершения всех потоков. Возникает вопрос, можно ли отслеживать в пуле потоки порожденные каким либо другим потоком? Т.е. сначала запускается 6 потоков расчета складов, каждый из которых ставит в пул по 41 потоку расчета потребностей торговых точек. И после отработки всех потоков по конкретному складу запускается поток анализа остатков на конкретном складе? TaskFactory.ContinueWhenAll ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2012, 15:58 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
Алексей К, Хм, можно про Task поподробнее? Т.е. я создаю задачу расчета по складу, а в ней создаю задачи расчета по магазинам? З.Ы. сам сейчас пытаюсь реализовать просто 2.0 но забрел в совершенные дебри. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2012, 16:01 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
Crazy_Wolfсам сейчас пытаюсь реализовать просто 2.0 но забрел в совершенные дебри.В .Net 2.0 тасков нет :-( ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2012, 16:18 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
Алексей КCrazy_Wolfсам сейчас пытаюсь реализовать просто 2.0 но забрел в совершенные дебри.В .Net 2.0 тасков нет :-( тогда WaitHandle ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2012, 19:39 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
pation, А тогда как правильно будет приспособить WaitHandle к 6 складам? Аналогично примеру в МСДН каждый склад сделать классом и в него передавать необходимый массив ManualResetEvent? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2012, 23:08 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
Crazy_Wolf, а разве нельзя просто из метода ставить 2 "задачу" на выполнение, пул - то один. Или я не совсем понял задачу. Кстати про Task вам правильно написали, там было бы удобнее решать эту задачу. ЗЫ а зачем ограничили все 10 потоками? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2012, 10:36 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
netivanCrazy_Wolf, а разве нельзя просто из метода ставить 2 "задачу" на выполнение, пул - то один. Или я не совсем понял задачу. Кстати про Task вам правильно написали, там было бы удобнее решать эту задачу. ЗЫ а зачем ограничили все 10 потоками? Там смысл в том что есть 6 раздельных складов, и я хотел бы начинать процедуру проверки остаков сразу после окончания работы всех активных потоков по данному складу. А то наша учетная система в области приема XML пакетов очень нетороплива, и в результате 1.5 часа идет полный расчет а потом еще 1 - 1,5 часа выгрузка в нее XML. Поэтому и хочется определить когда склад досчитался, рассчитать остатки и начать выгрузку, а остальные склады пусть досчитываются. Насчет Task почитал, действительно удобно, но у нас тут лицензия на 2008, т.е. ограничение максимум на 3.5 фреймворк. :( ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2012, 11:06 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
Crazy_Wolf, я так понимаю остатки тут считаются? WaitForComplete? Для каждого из 6 складов отдельно? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2012, 12:56 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
netivan, Точно так. Там пересчитываются остатки и потом выгружаются в торговую систему Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2012, 13:11 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
Собсвенно как оперделить закончили ли все потоки для склада работу? Или достаточно их просто помещать в пул по порядку вроде склад1 магазин1 ..... магазинН РасчетОстатковСклада1 склад2 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2012, 13:18 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
Сформируйте массив WaitHandle-ов и отдайте его в WaitHandle.WaitAll . ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2012, 13:23 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
Алексей КСформируйте массив WaitHandle-ов и отдайте его в WaitHandle.WaitAll .Упс, pation уже это советовал. Сори. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2012, 13:26 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
Алексей К, Да вот собсвенно здесь я и запутался. Мне для каждого склада формировать свой массив, чтоб понять что расчет закончился? Если можно ткните носом в какой - нить пример. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2012, 14:10 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
Crazy_WolfЕсли можно ткните носом в какой - нить пример.В той ссылке как раз есть подходящий пример. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2012, 15:02 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
1. Запускаем N-фоновых потоков. Можно через ThreadPool, можно самостоятельно создать потоки. В зависимости от потребностей. Формируем массив WaitHandle-ов, по одному на фоновый поток. 2. Ждём завершения фоновых потоков через WaitHandle.WaitAll 3. Выполняем обработку результата фоновых потоков. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2012, 15:08 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
Алексей К, Там, если я правиьно понимаю, ожидается завершение всех активных потоков. Это у меня тож реализовано. А в данныом случае я хочу понять что закончилась та "порция" потоков которая имеет отношения к конкретному складу. Попробую по другому расписать, вот у нас в пул отправлены потоки на все склады, хотелось бы знать когда закончится, к примеру, расчет первого и запустить для него процедуру пересчета остатков, а затем и выгрузки, а остальные пускай считаются себе дальше. Следующий, допустим отсчитался 5 (он совсем маленький), пересчитываем и выгружаем его. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2012, 15:12 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
Crazy_WolfТам, если я правиьно понимаю, ожидается завершение всех активных потоков.Не правильно понимаеш. Ожидается состояние переданных в WaitAll WaitHandle-ов. Ни про какие "активные потоки" WaitAll ничего не знает. Какие WaitHandle-ы в него передаш - то он и будет ждать. А уже состояние этих WaitHandle-ов меняеш из своих "активных потоков" по мере выполнения фоновых задач. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2012, 15:16 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
Crazy_Wolf, вот оно что :) думаю при завершении поток должен вызвать событие, которое будет где-то фиксировать типа склад 1 на 50% выполнен и если будет 100% запускать новую задачу. Т.е. вам не надо знать именно, что "Поток закончился". ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2012, 15:18 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
netivanCrazy_Wolf, вот оно что :) думаю при завершении поток должен вызвать событие, которое будет где-то фиксировать типа склад 1 на 50% выполнен и если будет 100% запускать новую задачу. Т.е. вам не надо знать именно, что "Поток закончился". Точно так. У меня была мысль сделать что-то индусское типа Код: c# 1.
Но ИМХО будет очень криво :( ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2012, 15:31 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
Поторопился отправить. В смысле в этом массиве держать число непросчитанных складов и, если, элемент равен 0, то для этого склада запускать рассчет. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2012, 15:33 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
Crazy_Wolf, логику понял. не вижу в этом ничего плохого. во всяком случае вы не будете ждать расчет всех складов :) лочить только не забывайте) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2012, 15:36 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
а можно еще сделать контекст поткоа свой, туда передавать номер склада и опрашивать их в 7 потоке. вот это будет круто=) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2012, 15:37 |
|
Отслеживание потоков в пуле
|
|||
---|---|---|---|
#18+
netivan, Можно поподробнее, я честно говоря в этом проекте первый раз столкнулся с больше чем основной и фоновый поток в приложении. :) Это получается запустить некий поток с таймером, который будет постоянно мониторить состояние этого массива? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2012, 15:45 |
|
|
start [/forum/topic.php?fid=20&msg=37827781&tid=1406379]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
71ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 168ms |
0 / 0 |