powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Потоки.. Несколько вопросов.
25 сообщений из 74, страница 1 из 3
Потоки.. Несколько вопросов.
    #39933130
Фотография Tech N9ne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Подскажите пожалуйста, правильно ли я запускаю потоки.
Мне нужно 8 потоков, по этому цикл for 1-8.
И еще, не мало важный вопрос.
Где вопросительные знаки, там я не понимаю, как обратится к конкретному элементу массива...
Подскажите пожалуйста.
Сейчас такой код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
IMG_MASS: array [1 .. 8] of string; // тут хранятся ссылки на png
IMGs: array [1 .. 8] of TsImage;  // Image, в которые будут лоадится pngшки
POTOK: array [1 .. 8] OF TMYTHREAD; // 8 потоков ))
....
for i := 1 to 8 do 
    begin
      POTOK[i] := TMYTHREAD.Create(True);
      POTOK[i].FreeOnTerminate := True;
      POTOK[i].Priority := tpNormal;
      POTOK[i].Resume;
    end;


procedure TMYTHREAD.Execute;
begin
  if DownloadFile('https://' + IMG_MASS[???], ExtractFilePath(ParamStr(0)) + 'weak' + IntToStr(???) + '.png')
  then
  begin
    IMGs[???].ImageIndex := -1;
    IMGs[???].Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'weak' + IntToStr(???) + '.png');
  end;
end;




Как дать каждому потоку, по скачки 1 файла?
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39933156
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tech N9neКак дать каждому потоку, по скачки 1 файла?

Передать ему i в конструктор. Или, раз уж создаёшь в заторможенном состоянии - в public
member.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39933165
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А лучше сразу делать правильно и изолировать поток от внешних переменных. Т.е. скачивать в собственный объект, а в главном методе загружать в массив IMG. Либо вообще не связываться с загрузкой изображения в потоке (разве что картинки гигантские - но тут еще надо смотреть, поддерживает ли TsImage многопоточность).
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39933177
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TQueue поможет делить файлы.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39933180
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто мешает при создании потока указать, какой и куда файл скачивать?
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39933182
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Также еще надо подумать, как определять момент завершения всех потоков, рассмотреть случай досрочного закрытия программы и потихоньку прийти к выводу, что FreeOnTerminate - зло
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39933186
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45
Кто мешает при создании потока указать, какой и куда файл скачивать?
Мешает неоднородность в производительности разных потоков.

Например файлы могут быть сильно разного размера.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39933300
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tech N9ne,
конкретно по вопросу
Код: pascal
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.
IMG_MASS: array [1 .. 8] of string; // тут хранятся ссылки на png
IMGs: array [1 .. 8] of TsImage;  // Image, в которые будут лоадится pngшки
POTOK: array [1 .. 8] OF TMYTHREAD; // 8 потоков ))

type 
  TMYTHREAD = class(TThread)
    public
      MyIndex: Byte;
....
for i := 1 to 8 do 
    begin
      POTOK[i] := TMYTHREAD.Create(True);
      POTOK[i].MyIndex := i;
      POTOK[i].FreeOnTerminate := True;
      POTOK[i].Priority := tpNormal;
      POTOK[i].Resume;
    end;


procedure TMYTHREAD.Execute;
begin
  if DownloadFile('https://' + IMG_MASS[???], ExtractFilePath(ParamStr(0)) + 'weak' + IntToStr(???) + '.png')
  then
  begin
    IMGs[MyIndex].ImageIndex := -1;
    IMGs[MyIndex].Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'weak' + IntToStr(???) + '.png');
  end;
end;
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39933846
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tech N9ne,

Параметры можно передавать в конструкторе
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935487
Фотография Tech N9ne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius, Спасибо.

Скажите пожалуйста, вот например мне нужно чекнуть прокси на валид... У меня их n количество.
Как я могу распределить n кол-во проксей, на n кол-во потоков?
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935510
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создай список проксей а потоками разбирай из списка по одному на проверку пока не закончатся.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935513
Фотография Tech N9ne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Создай список проксей а потоками разбирай из списка по одному на проверку пока не закончатся.

Я немного не понимаю саму механику работы)
К примеру 1000 проксей, 5 потоков...
если я сделаю так же как в прошлый раз, с переменной, то чекнуться только 5 проксей) так как 5 потоков..
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
type 
  TMYTHREAD = class(TThread)
    public
      MyIndex: Byte;
....
for i := 1 to 8 do 
    begin
      POTOK[i] := TMYTHREAD.Create(True);
      POTOK[i].MyIndex := i;
      POTOK[i].FreeOnTerminate := True;
      POTOK[i].Priority := tpNormal;
      POTOK[i].Resume;
    end;
Не создавать же мне столько потоков, сколько проксей в txt)


procedure TMYTHREAD.Execute;
begin
  чекнуть_прокси[myindex]
  end;
end;
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935514
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделай в потоке цикл проверок.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935515
Фотография Tech N9ne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Сделай в потоке цикл проверок.

Так я вот и не разберу, как мне проверять, какие strings уже чекались, а какие нет..
Я понял что в цикле..
Ладно, спасибо, видать просто поспать нужно, утро вечера мудреннее)
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935521
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tech N9ne
rgreat
Сделай в потоке цикл проверок.

Так я вот и не разберу, как мне проверять, какие strings уже чекались, а какие нет..
Я понял что в цикле..
Ладно, спасибо, видать просто поспать нужно, утро вечера мудреннее)


Зачем вам потоки, если вам надо решать задачи, которые успешно решают таски...
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
var
  Items: TList<Int32>;
begin
  Items := TList<Int32>.Create();
  for var k := 1 to 1000 do
    Items.Add(k);

  var Proc :=
    procedure (const aItem: Int32)
    begin
      TTask.Run(
        procedure
        begin
          //чекнуть_прокси[aItem]
        end
      );
    end;

  for var Item in Items do
    Proc(Item); // Обязательно так, иначе замыкание будет работать некорректно, об этом можно почитать в справке
end;



Кол-во одновременно выполняемых задачи будет зависеть от кол-ва виртуальных процессоров (CPU * Core) * магическая константа, но можно задать для пула ограничение магической константы = 1 если очень надо...
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935525
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потоки и таски - почти одно и тоже.

И если уж идти в сторону прослоек над TThread и синтаксического сахара тогда надо парралель фор делать.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var
  Items: TList<Int32>;
begin
  Items := TList<Int32>.Create();
  for var k := 1 to 1000 do
    Items.Add(k);

  TParallel.&For(0, Items.Count-1, procedure (i: integer) begin
      // чекнуть_прокси из Items[i]
    end);
end;
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935526
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
..
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935527
Фотография Tech N9ne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,
Возможно вы меня недопоняли? Про таски впервые слышу)
Код: pascal
1.
{ в stringlist`e Proxy, которые нужно чекнуть гет запросом на валидность, и тип.}


Всё что мне нужно это понять, как не дать определённому количеству потоков, обращаться к одному и тому же strings[].
Я могу сделать потоки, но только с количеством равному stringlist.count; И каждый поток будет обрабатывать свой strings[]. Но stringsов может быть и 1000 и 10000..
Но как сделать любое колчество потоков, и заставить работать со строками из stringlist, избегая одновременного обращение к одному и тому же strings[].

Если код который вы привели, это прямой ответ моему вопросу, тогда простите, я еще глуп, что бы до конца понять, что к чему там).
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935528
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tech N9ne,

Если вы до сих пор ничего не поняли - наймите програмиста.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935536
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935552
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite


Кол-во одновременно выполняемых задачи будет зависеть от кол-ва виртуальных процессоров (CPU * Core) * магическая константа, но можно задать для пула ограничение магической константы = 1 если очень надо...


Может так:
TThreadPool.Default.SetMinWorkerThreads(100)
?
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935618
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
X-Cite


Кол-во одновременно выполняемых задачи будет зависеть от кол-ва виртуальных процессоров (CPU * Core) * магическая константа, но можно задать для пула ограничение магической константы = 1 если очень надо...


Может так:
TThreadPool.Default.SetMinWorkerThreads(100)
?

Опытным путем
SetMaxWorkerThreads - Задает ограничение сверху. Максимальное кол-во одновременно выполняемых задач в указанном пуле. По умолчанию Cpu * Core * 25; Не может быть меньше, чем Cpu * Core

SetMinWorkerThreads - Кол-во задач, которое может быть принято в работу до увеличения пула. По умолчанию Cpu * Core. Не может быть больше чем указано в SetMaxWorkerThreads.

Т.е. если у вас 1 процессор и 4 ядра, то по умолчанию
MaxWorkerThreads = 1 * 4 * 25 = 100
MinWorkerThreads = 1 * 4
Это значит что одновременно может выполняться не более 100 задач, при этом только 4 задачи могут быть запущены сразу... остальные поместятся в очередь и будут запущены либо после выполнения одной из четырех, либо через магическое время (вроде 1 секунда) будут запускаться по одной при условии, что CPU не загружен на 80%, увеличивая кол-во потоков для выполнения задач.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935624
X-Cite,

А у меня процессор может выполнять в двое больше, при двое меньшем количестве ядер
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935628
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite

Опытным путем
SetMaxWorkerThreads - Задает ограничение сверху. Максимальное кол-во одновременно выполняемых задач в указанном пуле. По умолчанию Cpu * Core * 25; Не может быть меньше, чем Cpu * Core

Cpu и Core в Вашей формуле что означают?

В System есть только переменная CPUCount (ей присваивается SysInfo.dwNumberOfProcessors), означающая количество логических ядер (Number of CPU Cores detected)
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935629
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.
...
Рейтинг: 0 / 0
25 сообщений из 74, страница 1 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Потоки.. Несколько вопросов.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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