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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Параллельность потоков 
:(
    Опции темы
MAGISTRShuba
  Дата 15.2.2013, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток =)
Столкнулся с такой проблемой - есть определенное количество картинок, которые будут скачиваться функцией, которой мы будем передавать ссылку на эту картинку. У меня есть лист потоков и очередь этих самых ссылок, которые нужно передать для загрузки. При том так, чтобы каждый поток скачивал равное количество картинок. К примеру - Поток 1 - передает на скачку из листа 1,2,3 картинку, Поток 2 - 4,5,6 картинку, и так далее. При этом, должно быть распределение между потоками, которые будут регулироваться пользователем - например, 20 картинок и 2 потока - каждый поток качает по 10 картинок (или сколько сможет)... Т.е. потоки ДОЛЖНЫ присутствовать..

Делал так:
Код


for (int i = 0; i < totalThreads; i++) // потоки
            {
                threads.Add(new Thread(Potok));
            }
            Parallel.For(0, totalImage, k => 
            {
                 while (totalImage != uploadsTotal)
                {
                    for (int j = 0; j < totalThreads; j++)
                    {
                        if (!threads[j].IsAlive)
                        {
                            try
                            {
                                threads[j].Start(itog.Dequeue()); // отсылаем в функцию загрузки строку
                            }
                            catch (Exception e)
                            {
                                Trace.WriteLine("Caught ", e.Message);
                            }
                         }
                      }
                 }
            });


Подскажите, где что нужно поменять, что бы сие чудо работало? 
P.S. я нуб, будьте милосердны..
PM MAIL   Вверх
AntonX
Дата 3.3.2013, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



напиши все без использования Parallel.For
на чистых потоках вручную. Когда придет понимание сути самих потоков - перепишешь на PLinq
PM MAIL ICQ   Вверх
wester
Дата 7.3.2013, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



http://stackoverflow.com/questions/419019/...lists-with-linq
Код

public static List<List<object>> Split(List<object> source)
{
    return  source
        .Select((x, i) => new { Index = i, Value = x })
        .GroupBy(x => x.Index / 3)
        .Select(x => x.Select(v => v.Value).ToList())
        .ToList();
}


и еще. Когда писал на Qt 
использовал эту функцию
Код

QVector<int> chunkSizes(const int size, const int chunkCount)
{
    Q_ASSERT(size > 0 && chunkCount > 0);
    if (chunkCount == 1)
        return QVector<int>() << size;
    QVector<int> result(chunkCount, size / chunkCount);
    if (int remainder = size % chunkCount) {
        int index = 0;
        for (int i = 0; i < remainder; ++i) {
            ++result[index];
            ++index;
            index %= chunkCount;
        }
    }
    return result;
}

//usage
const QVector<int> sizes = AQP::chunkSizes(sourceFiles.count(),
            QThread::idealThreadCount());

    int offset = 0;
    foreach (const int chunkSize, sizes) {
ConvertImageTask *convertImageTask = new ConvertImageTask(
                this, &stopped, sourceFiles.mid(offset, chunkSize),
                targetTypeComboBox->currentText());
        QThreadPool::globalInstance()->start(convertImageTask);
offset += chunkSize;
    }


то есть в chunkSize передаешь длину массива и сколько фрагментов надо получить, а функция возвращает вектор фрагментов. Далее через цикл foreach проходишь по возвращенному вектору и берешь n- количество элементов (возвращенных из chunkSizes) из основного массива.
Идея понятна, переделка практически не требуется

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

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


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

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




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


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

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