powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Отслеживание потоков в пуле
25 сообщений из 27, страница 1 из 2
Отслеживание потоков в пуле
    #37826191
Crazy_Wolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую. Возник такой вопрос.
Задача паралельного расчета потребностей торговых точек. . Есть 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.
            _completed = new AutoResetEvent(false);
            var dateOrder = DateTime.Now.Date;
            // очищаем старые зааказы
            AutoOrders.ClearCalcToDate(dateOrder);

            // пишем в лог
            textBoxSoLog.AppendText(string.Format("{0} запущено формирование складских требований\r\n", DateTime.Now ));

            // определяем максимально значение для ПрогрессБара И предполагаемое количество потоков
            int intStorageCount = 0;
            foreach (DataGridViewRow dgvr in dgvCreateCO.Rows)
            {
                if (Convert.ToInt32(dgvr.Cells["CreateOrdersCO"].Value) == 1)
                {
                    intStorageCount++;
                }
            }
            _runningWorkers = intStorageCount * clbShopsCO.CheckedItems.Count;
            ThreadPool.SetMaxThreads(10, 10);
            pbSo.Minimum = 0;
            pbSo.Maximum = _runningWorkers;
            pbSo.Value = 0;
            pbSo.Step = 1;

            foreach (DataGridViewRow dgvr in dgvCreateCO.Rows)
            {
                if (Convert.ToInt32(dgvr.Cells["CreateOrdersCO"].Value) == 1)
                {
                    foreach (DataRowView drv in clbShopsCO.CheckedItems)
                    {
                        DataRowView drvLocal = drv;
                        DataGridViewRow dgvrLocal = dgvr;
                        ThreadPool.QueueUserWorkItem(stateThread =>
                                                     CreateSoToShop(Convert.ToInt32(drvLocal["id"]),
                                                                    Convert.ToInt32(dgvrLocal.Cells["Contract"].Value),
                                                                    dgvrLocal.Cells["Commentary"].Value.ToString(),
                                                                    Convert.ToInt16(drvLocal["autoso"])));
                        textBoxSoLog.AppendText(string.Format("{0} поставлен в очередь магазин {1} склад {2}\r\n", DateTime.Now, drvLocal["name"], dgvrLocal.Cells["Commentary"].Value));
                    }
                }
            }
            ThreadPool.QueueUserWorkItem(WaitForComplete);
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37826212
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crazy_WolfСейчас это делается после полного расчета и завершения всех потоков. Возникает вопрос, можно ли отслеживать в пуле потоки порожденные каким либо другим потоком? Т.е. сначала запускается 6 потоков расчета складов, каждый из которых ставит в пул по 41 потоку расчета потребностей торговых точек. И после отработки всех потоков по конкретному складу запускается поток анализа остатков на конкретном складе? TaskFactory.ContinueWhenAll
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37826218
Crazy_Wolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

Хм, можно про Task поподробнее?
Т.е. я создаю задачу расчета по складу, а в ней создаю задачи расчета по магазинам?

З.Ы. сам сейчас пытаюсь реализовать просто 2.0 но забрел в совершенные дебри.
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37826258
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crazy_Wolfсам сейчас пытаюсь реализовать просто 2.0 но забрел в совершенные дебри.В .Net 2.0 тасков нет :-(
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37826597
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КCrazy_Wolfсам сейчас пытаюсь реализовать просто 2.0 но забрел в совершенные дебри.В .Net 2.0 тасков нет :-(

тогда WaitHandle
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37826791
Crazy_Wolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pation,

А тогда как правильно будет приспособить WaitHandle к 6 складам?
Аналогично примеру в МСДН каждый склад сделать классом и в него передавать необходимый массив ManualResetEvent?
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37827103
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crazy_Wolf,

а разве нельзя просто из метода ставить 2 "задачу" на выполнение, пул - то один. Или я не совсем понял задачу. Кстати про Task вам правильно написали, там было бы удобнее решать эту задачу.
ЗЫ а зачем ограничили все 10 потоками?
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37827164
Crazy_Wolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
netivanCrazy_Wolf,

а разве нельзя просто из метода ставить 2 "задачу" на выполнение, пул - то один. Или я не совсем понял задачу. Кстати про Task вам правильно написали, там было бы удобнее решать эту задачу.
ЗЫ а зачем ограничили все 10 потоками?

Там смысл в том что есть 6 раздельных складов, и я хотел бы начинать процедуру проверки остаков сразу после окончания работы всех активных потоков по данному складу. А то наша учетная система в области приема XML пакетов очень нетороплива, и в результате 1.5 часа идет полный расчет а потом еще 1 - 1,5 часа выгрузка в нее XML. Поэтому и хочется определить когда склад досчитался, рассчитать остатки и начать выгрузку, а остальные склады пусть досчитываются.
Насчет Task почитал, действительно удобно, но у нас тут лицензия на 2008, т.е. ограничение максимум на 3.5 фреймворк. :(
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37827445
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crazy_Wolf,

я так понимаю остатки тут считаются? WaitForComplete? Для каждого из 6 складов отдельно?
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37827488
Crazy_Wolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
var dtSo = new DataTable();
            var dateOrder = DateTime.Now.Date;
            _completed.WaitOne();
            // Пересчитываем пропорционально остаткам на складе
            LogToTextBox(textBoxSoLog, string.Format("{0} Расчет потребностей магазинов завершен, проверяем остатки по РЦ\r\n", DateTime.Now));
            AutoOrders.RecalcQuantity(DateTime.Now.Date);
            // второй круг - выгружаем из созданной таблицы в ХМЛ
            foreach (DataGridViewRow dgvr in dgvCreateCO.Rows)
            {
                if (Convert.ToInt32(dgvr.Cells["CreateOrdersCO"].Value) == 1)
                {
                    LogToTextBox(textBoxSoLog, string.Format("Выгружаем заказы для склада {0} - {1}", dgvr.Cells["Contract"].Value, dgvr.Cells["Commentary"].Value));
                    foreach (DataRowView drv in clbShopsCO.CheckedItems)
                    {
                        LogToTextBox(textBoxSoLog, string.Format("{0} Выгружаем заказы для магазина {1}", DateTime.Now, drv["name"]));
                        dtSo.Clear();
                        dtSo = AutoOrders.FillDataTable(dateOrder, Convert.ToInt32(drv["id"]), Convert.ToInt16(dgvr.Cells["Contract"].Value)).Copy();
                        if (dtSo.Rows.Count > 0)
                        {
                            string strResult = AutoOrders.CreateXmlCo(dtSo, Convert.ToInt32(drv["id"]), dateOrder);
                            LogToTextBox(textBoxSoLog, string.Format("{0}", strResult));
                        }
                        else
                        {
                            LogToTextBox(textBoxSoLog, string.Format("Заказ пустой"));
                        }
                    }
                }
            }
            //pbSo.Value = 0;
            LogToTextBox(textBoxSoLog, string.Format("{0} Обработка окончена\r\n", DateTime.Now));
            // временная мера, отправляем письмо об окончении процесса
            string[] strEmail = {"email@server.ru"};
            Service.SendEMail(username, userpass, strEmail, "Формирование складских требований", textBoxSoLog.Text, null);
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37827506
Crazy_Wolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собсвенно как оперделить закончили ли все потоки для склада работу? Или достаточно их просто помещать в пул по порядку вроде
склад1
магазин1
.....
магазинН
РасчетОстатковСклада1
склад2
?
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37827524
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сформируйте массив WaitHandle-ов и отдайте его в WaitHandle.WaitAll .
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37827530
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КСформируйте массив WaitHandle-ов и отдайте его в WaitHandle.WaitAll .Упс, pation уже это советовал. Сори.
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37827638
Crazy_Wolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

Да вот собсвенно здесь я и запутался. Мне для каждого склада формировать свой массив, чтоб понять что расчет закончился?
Если можно ткните носом в какой - нить пример.
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37827747
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crazy_WolfЕсли можно ткните носом в какой - нить пример.В той ссылке как раз есть подходящий пример.
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37827757
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Запускаем N-фоновых потоков. Можно через ThreadPool, можно самостоятельно создать потоки. В зависимости от потребностей. Формируем массив WaitHandle-ов, по одному на фоновый поток.

2. Ждём завершения фоновых потоков через WaitHandle.WaitAll

3. Выполняем обработку результата фоновых потоков.
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37827767
Crazy_Wolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

Там, если я правиьно понимаю, ожидается завершение всех активных потоков. Это у меня тож реализовано. А в данныом случае я хочу понять что закончилась та "порция" потоков которая имеет отношения к конкретному складу.
Попробую по другому расписать, вот у нас в пул отправлены потоки на все склады, хотелось бы знать когда закончится, к примеру, расчет первого и запустить для него процедуру пересчета остатков, а затем и выгрузки, а остальные пускай считаются себе дальше. Следующий, допустим отсчитался 5 (он совсем маленький), пересчитываем и выгружаем его.
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37827781
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crazy_WolfТам, если я правиьно понимаю, ожидается завершение всех активных потоков.Не правильно понимаеш. Ожидается состояние переданных в WaitAll WaitHandle-ов. Ни про какие "активные потоки" WaitAll ничего не знает. Какие WaitHandle-ы в него передаш - то он и будет ждать. А уже состояние этих WaitHandle-ов меняеш из своих "активных потоков" по мере выполнения фоновых задач.
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37827782
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crazy_Wolf,

вот оно что :) думаю при завершении поток должен вызвать событие, которое будет где-то фиксировать типа склад 1 на 50% выполнен и если будет 100% запускать новую задачу. Т.е. вам не надо знать именно, что "Поток закончился".
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37827818
Crazy_Wolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
netivanCrazy_Wolf,

вот оно что :) думаю при завершении поток должен вызвать событие, которое будет где-то фиксировать типа склад 1 на 50% выполнен и если будет 100% запускать новую задачу. Т.е. вам не надо знать именно, что "Поток закончился".
Точно так. У меня была мысль сделать что-то индусское типа
Код: c#
1.
private static intint[] _runningWorkers; // элементы по числу складов


Но ИМХО будет очень криво :(
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37827821
Crazy_Wolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поторопился отправить.
В смысле в этом массиве держать число непросчитанных складов и, если, элемент равен 0, то для этого склада запускать рассчет.
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37827833
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crazy_Wolf,

логику понял. не вижу в этом ничего плохого. во всяком случае вы не будете ждать расчет всех складов :) лочить только не забывайте)
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37827835
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а можно еще сделать контекст поткоа свой, туда передавать номер склада и опрашивать их в 7 потоке. вот это будет круто=)
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37827849
Crazy_Wolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
netivan,

Можно поподробнее, я честно говоря в этом проекте первый раз столкнулся с больше чем основной и фоновый поток в приложении. :)
Это получается запустить некий поток с таймером, который будет постоянно мониторить состояние этого массива?
...
Рейтинг: 0 / 0
Отслеживание потоков в пуле
    #37827856
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crazy_WolfЭто получается запустить некий поток с таймером, который будет постоянно мониторить состояние этого массива?Это самое плохое решение из всех возможных.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Отслеживание потоков в пуле
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]