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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2019, 23:15   #1
PaHaNjkee
Delphi 10 Seattle
Пользователь
 
Аватар для PaHaNjkee
 
Регистрация: 01.11.2010
Сообщений: 90
Стрелка Рассчитать количество аккаунтов на поток

Привет, ребят. Мозги настолько ссохлись, что не могу додумать правильную реализацию. Необходимо сделать как. Есть ограничение на создание максимального количества потоков (maxThreads = 1000).
Если аккаунтов <= макс. количества, потоков создаётся столько, сколько имеем аккаунтов. И вот проблема. Если аккаунтов больше, то нужно как-то распределить их по кол-ву максимальных потоков. В поток передаётся смещение и количество (для выборки из листа), и в потоке перебирается всё в цикле:
Код:
for i := fOffset to fOffset + fCount - 1 do
// do
Ах, да, сбился с темы. Например, аккаунтов 8999, а maxThreads = 1000, код создаёт 1000 потоков, в которых кол-во 8, а у последнего потока кол-во 999, как-то нелогично. Нужно, чтобы примерно по 9 было в каждом потоке, а в последнем остаток. Голова не варит, серьёзно. Код создания потоков:
Код:
accsCount := globalList.Count;
  if accsCount <= maxThreads then
    threadsCount := accsCount
  else
    threadsCount := maxThreads;

  if threadsCount = accsCount then
  begin
    SetLength(downloadThread, threadsCount);
    for i := 0 to threadsCount-1 do
    begin
      downloadThread[i] := TDownload.Create(i, 1);
      downloadThread[i].Start;
    end;
  end else begin
    accountsPerThreadCount := (accsCount div threadsCount) * 1;
    modvalue := (accsCount mod threadsCount) * 1;
    if modvalue > 0 then
      cycle := threadsCount
    else
      cycle := threadsCount-1;

    SetLength(downloadThread, cycle+1);

    for i := 0 to cycle do
    begin
      finalaccscount := accountsPerThreadCount;
      if i = cycle then
        finalaccscount := accsCount - (accountsPerThreadCount*cycle);

      downloadThread[i] := TDownload.Create(i * accountsPerThreadCount, finalaccscount);
      downloadThread[i].Start;
    end;
  end;
PaHaNjkee вне форума Ответить с цитированием
Старый 11.04.2019, 23:31   #2
PaHaNjkee
Delphi 10 Seattle
Пользователь
 
Аватар для PaHaNjkee
 
Регистрация: 01.11.2010
Сообщений: 90
По умолчанию

Включалка заработала, и получилось
Код:
accountsPerThreadCount := ((accsCount div threadsCount) * 1) + 1;
    for i := 0 to threadsCount-1 do // to cycle
    begin
      if createCount >= accsCount then
        break;
      finalaccscount := accountsPerThreadCount;
      if (accsCount - createCount < accountsPerThreadCount) then
        finalaccscount := accsCount - createCount;

      SetLength(downloadThread, i+1);
      downloadThread[i] := TDownload.Create(i, i * accountsPerThreadCount, finalaccscount);
      downloadThread[i].Start;
      Inc(createCount, accountsPerThreadCount);
    end;
PaHaNjkee вне форума Ответить с цитированием
Старый 12.04.2019, 05:56   #3
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Я бы использовал пул-потоков.

Как пул потоков планирует работы потоков?
Поток опрашивает очередь в течении NonSleepTime. Если не находит задач то засыпает.
Если пул- потоков обнаруживает что потоки не используются более TimeLive=CoiffecienLive* NonSleepTime то поток уничтожается.

Новые потоки создаются если замечено нехватка рабочих потоков. Потоки не забрали ни одну задачу за WorkTime.
Если задач нет, то потоки либо засыпают, либо уничтожаются. Если потоков меньше минимума то они спят если больше уничтожаются.

http://embarcadero.newsgroups.archiv...001126520.html

http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

http://msdn.microsoft.com/ru-ru/libr...v=vs.110).aspx

http://rsdn.ru/forum/delphi/1181461.all
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ассемблер. Рассчитать количество троек 0 в массве frady-tran Помощь студентам 4 15.01.2017 20:33
Рассчитать количество уникальных пользователей Sergey.01 SQL, базы данных 3 03.01.2015 11:24
Рассчитать количество мужчин и женщин Кристинка89 SQL, базы данных 20 11.04.2012 11:13
Как рассчитать количество люмин. ламп на 1м2 olegwolf Microsoft Office Excel 7 12.06.2011 22:48
Рассчитать количество строк. ideasforlife Общие вопросы C/C++ 0 08.05.2011 13:57