powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Потоки.. Несколько вопросов.
74 сообщений из 74, показаны все 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
Потоки.. Несколько вопросов.
    #39935680
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
X-Cite,

А у меня процессор может выполнять в двое больше, при двое меньшем количестве ядер

Ну вручную выставьте MaxWorkerThreads = 200.... Будет вам 200 задач...

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

В System есть только переменная CPUCount (ей присваивается SysInfo.dwNumberOfProcessors), означающая количество логических ядер (Number of CPU Cores detected)
Cpu - физические процессоры
Core - ядра на них...
т.е. сервер состоящий из 4 процессоров по 6 ядер = 4 * 6 = 24 виртуальных процессоров = dwNumberOfProcessors = CPUCount
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935689
Фотография Tech N9ne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Погуглив нашёл пример, что нужно использовать критическую секцию, что бы потоки не обращались к одной и той же строке из Stringlist...
Но поток вообще не работает. Пример простой, пытаюсь в потоках достать из стринглиста строки, разделить на айпи-порт, и вставить результат в мемо.
Скажите пожалуйста, почему потоки не работают, что я не так сделал?

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
  TMyThread = class(TThread)
  public
    MyIndex: Byte;
    IP,Port:string;
  protected
    procedure sync;
    procedure execute;
  end;

var
  Form1: TForm1;
  ProxyList: TStringList;
  ptk: array [1 .. 10] of TMyThread; // ПОТОКИ
  WORK: Boolean;  
  Proxy_tic: Integer; 
  CS: TCriticalSection; // КРИТИЧЕСКАЯ СЕКЦИЯ
  
  
  
  
  {Запуск потоков}
  var
  i: Integer;
begin
  WORK := True;
  Proxy_tic := -1; // переменной присваиваю -1, так как в потоке первым делом она Inc(), и будет ровняться 0
  for i := 1 to StrToInt(sTrackEdit1.Text) do // количество потоков
  begin
    ptk[i] := TMyThread.Create(True);
    ptk[i].FreeOnTerminate := True;
    ptk[i].Priority := tpNormal;
    ptk[i].Resume;
  end;
end;
  
  
  
  { TMyThread }

procedure TMyThread.execute;
var
  Position: Integer;
begin
  while WORK do
  begin
    Inc(Proxy_tic); // увеличиваю переменную
    CS.Enter; // крит секция
    if Proxy_tic < ProxyList.Count then // если переменная меньше чем строк в стринглисте
    begin
     MyIndex := Proxy_tic;  // присваиваю переменной потока нужное значение
    end
    else
    begin
      WORK := False;
    end;
    CS.Leave;

    Position := Pos('', ProxyList.Strings[MyIndex]);  // НАХОЖУ РАЗДЕЛИТЕЛЬ :  
     IP := Copy(ProxyList.Strings[MyIndex], 0, Position -1); //   БЕРУ АЙПИ 
     Port := Copy(ProxyList.Strings[MyIndex], Position +1, ProxyList.Strings[MyIndex].Length); // И ПОРТ
     Synchronize(sync);
  end;

end;

procedure TMyThread.sync;
begin
  Form1.sMemo1.Lines.Add(IntToStr(MyIndex) + IP + Port) ; 
end;
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935690
X-Cite

Ну вручную выставьте MaxWorkerThreads = 200.... Будет вам 200 задач...

...


У меня на 1 ядро, приходиться по 2 потока.


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
TThread.ProcessorCount : FProcessorCount := System.CPUCount; 

....
const MaxThreadsPerCPU = 25;

FMaxLimitWorkerThreadCount := TThread.ProcessorCount * MaxThreadsPerCPU;
....

function TThreadPool.SetMaxWorkerThreads(Value: Integer): Boolean;
begin
  Result := Value >= TThread.ProcessorCount;
  if Result then
    TInterlocked.Exchange(FMaxLimitWorkerThreadCount, Value);
end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
   MaxThreadsPerCPU = 25;
    // Constants used for calculating CPU Usage
    CPUUsageHigh = 95; // Start retiring/removing threads when CPU usage gets this high
    CPUUsageLow = 80; // Add more threads if the CPU usage is below this
    CPUUsageLowest = 20; // Shrink the thread pool when CPU usage falls below this
    NumCPUUsageSamples = 10; // Keep a running list of CPU Usage samples over which the average is calculated
    MonitorThreadDelay = 500;
    SuspendInterval = 5000 + MonitorThreadDelay; // Interval to use for suspending work in worker threads
    SuspendTime = MonitorThreadDelay + 100; // Time to spend in SuspendWork;
    RetirementDelay = 5000; // Delay interval for retiring threads

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

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

Вам же сказали, что для решения вашей задачи не нужно использовать голые потоки...
Намного проще и красивее будет использовать Таски...

Хорошо, пусть таски, но я же должен понять, почему у меня не работают потоки. Иначе как мне учится на ошибках?)
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935723
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tech N9ne
Хорошо, пусть таски, но я же должен понять, почему у меня не работают потоки. Иначе как мне учится на ошибках?)
Вам бы для начала прочитать что тут уже написано, включая ссылки.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935726
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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Threading, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Memo3: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    procedure NewThread(const s: TStrings; Index, Offset, Max: NativeUInt);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.NewThread(const s: TStrings; Index, Offset, Max: NativeUInt);
  function GetOffsetStings(): TArray<string>;
  var
    i: NativeUInt;
  begin
    SetLength(Result, Max);
    for i := 0 to Max - 1 do
      Result[i] := s.Strings[Offset + i];
  end;

var
  Arr: TArray<string>;
  i: Integer;
begin
  Arr := GetOffsetStings();

  Memo3.Lines.Add('Thread ' + Index.ToString + ' lines : ');
  for i := Low(Arr) to High(Arr) do
    Memo3.Lines.Add(Arr[i]);
  Memo3.Lines.Add('');

  TThread.CreateAnonymousThread(
    procedure()
    var
      i: Cardinal;
    begin
      for i := Low(Arr) to High(Arr) do
      begin
        TThread.Synchronize(nil,
          procedure
            procedure parseIp(const s: string; out ip, port: string);
            var
              i: Integer;
              b: Boolean;
            begin
              b := false;
              for i := Low(s) to High(s) do
              begin
                if not b then
                  if s[i] = ':' then
                  begin
                    b := true;
                    continue;
                  end;

                if b then
                   port := port + s[i]
                 else
                   ip := ip + s[i];
               end;
             end;
          var
            ip, port: string;
          begin
            parseIp(Arr[i], ip, port);
            Memo2.Lines.Add(' Thread - ' + Index.ToString + ' = ' + ip + ':' + port);
          end);
      end;

    end).start;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i, rest, num, sum, count, NumThreads: Integer;
begin
  NumThreads := 8;

  num := Memo1.Lines.count;
  rest := num mod NumThreads;
  sum := num - rest;

  count := sum div NumThreads;

  for i := 0 to NumThreads - 1 do
  begin
    dec(sum, count);

    NewThread(Memo1.Lines, i, i * count, count);

    if (sum <= 0) and (rest >= 1) then
      NewThread(Memo1.Lines, i + 1, (i * count) + count, rest);
  end;
end;

end.



На вход
Memo1
Код: sql
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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
246.152.137.89:2012
18.197.250.246:5569
90.75.62.52:5740
15.196.162.148:1453
152.80.85.207:7255
225.242.148.30:6496
165.86.207.13:8129
71.247.18.36:6695
85.120.199.139:7905
118.248.215.181:8197
187.49.246.14:4233
223.37.173.46:5854
110.222.57.40:3929
230.65.168.71:6427
33.50.110.139:7909
238.165.4.197:4998
232.217.116.10:3714
69.69.91.247:3993
221.15.38.69:4244
204.166.232.26:3219
151.126.80.222:7722
133.49.43.180:3277
4.102.131.119:7826
111.159.99.90:5308
184.117.125.112:5145
226.250.195.201:4020
182.210.114.32:2521
194.144.15.175:8174
125.161.152.157:1466
221.158.98.172:3973
105.75.231.245:4692
41.4.57.160:6013
187.219.244.67:8834
190.198.178.105:8975
138.54.204.148:1483
135.16.15.107:4539
101.8.205.218:7633
41.77.211.116:6985
137.63.40.243:8241
112.65.239.49:8349
221.124.5.61:4931
33.47.19.49:6924
200.111.101.98:6018
0.48.10.55:1874
45.41.73.232:2605
234.221.244.86:7956
172.93.248.93:5389
122.108.101.90:5721
8.116.122.87:6327
210.254.98.82:2229
31.131.147.82:1566
38.149.113.27:2927
104.221.129.39:7915
10.38.190.116:1289
231.86.207.171:5513
32.101.158.50:8906
32.191.148.208:2462
110.63.74.72:1399
167.249.128.45:8266
43.71.188.72:7661
190.7.224.17:2363
244.14.44.67:4514
131.253.109.136:3923
5.98.208.59:3054
246.44.118.62:4726
96.137.78.130:7030
101.32.101.97:8327
23.57.237.33:6212
54.100.34.149:3002
66.108.128.195:3555
245.6.108.124:3552
142.20.80.29:2729
157.197.224.163:2518
196.15.222.12:7911
162.172.45.54:5398
83.7.181.61:4386
160.77.254.255:6286
241.104.222.39:6230
23.122.79.185:7959
175.93.139.59:1249
189.222.139.217:1163
81.138.204.3:6295
53.0.188.240:1131
181.139.169.64:5710
119.250.193.22:7074
222.110.147.21:8809
24.143.76.33:5756
49.252.241.14:8757
171.26.201.91:2231
222.36.129.137:2738
90.89.126.74:2225
73.60.43.162:5157
51.145.13.2:3110
161.52.157.67:6252
55.111.109.196:5283
211.178.123.209:5720
161.193.179.175:6777
188.150.69.240:1046
223.238.33.146:8986
234.143.67.216:6029




На выводе будет

Memo3
Код: sql
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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
Thread 0 lines : 
246.152.137.89:2012
18.197.250.246:5569
90.75.62.52:5740
15.196.162.148:1453
152.80.85.207:7255
225.242.148.30:6496
165.86.207.13:8129
71.247.18.36:6695
85.120.199.139:7905
118.248.215.181:8197
187.49.246.14:4233
223.37.173.46:5854

Thread 1 lines : 
110.222.57.40:3929
230.65.168.71:6427
33.50.110.139:7909
238.165.4.197:4998
232.217.116.10:3714
69.69.91.247:3993
221.15.38.69:4244
204.166.232.26:3219
151.126.80.222:7722
133.49.43.180:3277
4.102.131.119:7826
111.159.99.90:5308

Thread 2 lines : 
184.117.125.112:5145
226.250.195.201:4020
182.210.114.32:2521
194.144.15.175:8174
125.161.152.157:1466
221.158.98.172:3973
105.75.231.245:4692
41.4.57.160:6013
187.219.244.67:8834
190.198.178.105:8975
138.54.204.148:1483
135.16.15.107:4539

Thread 3 lines : 
101.8.205.218:7633
41.77.211.116:6985
137.63.40.243:8241
112.65.239.49:8349
221.124.5.61:4931
33.47.19.49:6924
200.111.101.98:6018
0.48.10.55:1874
45.41.73.232:2605
234.221.244.86:7956
172.93.248.93:5389
122.108.101.90:5721

Thread 4 lines : 
8.116.122.87:6327
210.254.98.82:2229
31.131.147.82:1566
38.149.113.27:2927
104.221.129.39:7915
10.38.190.116:1289
231.86.207.171:5513
32.101.158.50:8906
32.191.148.208:2462
110.63.74.72:1399
167.249.128.45:8266
43.71.188.72:7661

Thread 5 lines : 
190.7.224.17:2363
244.14.44.67:4514
131.253.109.136:3923
5.98.208.59:3054
246.44.118.62:4726
96.137.78.130:7030
101.32.101.97:8327
23.57.237.33:6212
54.100.34.149:3002
66.108.128.195:3555
245.6.108.124:3552
142.20.80.29:2729

Thread 6 lines : 
157.197.224.163:2518
196.15.222.12:7911
162.172.45.54:5398
83.7.181.61:4386
160.77.254.255:6286
241.104.222.39:6230
23.122.79.185:7959
175.93.139.59:1249
189.222.139.217:1163
81.138.204.3:6295
53.0.188.240:1131
181.139.169.64:5710

Thread 7 lines : 
119.250.193.22:7074
222.110.147.21:8809
24.143.76.33:5756
49.252.241.14:8757
171.26.201.91:2231
222.36.129.137:2738
90.89.126.74:2225
73.60.43.162:5157
51.145.13.2:3110
161.52.157.67:6252
55.111.109.196:5283
211.178.123.209:5720

Thread 8 lines : 
161.193.179.175:6777
188.150.69.240:1046
223.238.33.146:8986
234.143.67.216:6029



Memo2
Код: sql
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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
 Thread - 0 = 246.152.137.89:2012
 Thread - 1 = 110.222.57.40:3929
 Thread - 2 = 184.117.125.112:5145
 Thread - 3 = 101.8.205.218:7633
 Thread - 4 = 8.116.122.87:6327
 Thread - 5 = 190.7.224.17:2363
 Thread - 6 = 157.197.224.163:2518
 Thread - 7 = 119.250.193.22:7074
 Thread - 8 = 161.193.179.175:6777
 Thread - 0 = 18.197.250.246:5569
 Thread - 1 = 230.65.168.71:6427
 Thread - 2 = 226.250.195.201:4020
 Thread - 3 = 41.77.211.116:6985
 Thread - 4 = 210.254.98.82:2229
 Thread - 5 = 244.14.44.67:4514
 Thread - 6 = 196.15.222.12:7911
 Thread - 7 = 222.110.147.21:8809
 Thread - 8 = 188.150.69.240:1046
 Thread - 0 = 90.75.62.52:5740
 Thread - 1 = 33.50.110.139:7909
 Thread - 2 = 182.210.114.32:2521
 Thread - 3 = 137.63.40.243:8241
 Thread - 4 = 31.131.147.82:1566
 Thread - 5 = 131.253.109.136:3923
 Thread - 6 = 162.172.45.54:5398
 Thread - 7 = 24.143.76.33:5756
 Thread - 8 = 223.238.33.146:8986
 Thread - 0 = 15.196.162.148:1453
 Thread - 1 = 238.165.4.197:4998
 Thread - 2 = 194.144.15.175:8174
 Thread - 3 = 112.65.239.49:8349
 Thread - 4 = 38.149.113.27:2927
 Thread - 5 = 5.98.208.59:3054
 Thread - 6 = 83.7.181.61:4386
 Thread - 7 = 49.252.241.14:8757
 Thread - 8 = 234.143.67.216:6029
 Thread - 0 = 152.80.85.207:7255
 Thread - 1 = 232.217.116.10:3714
 Thread - 2 = 125.161.152.157:1466
 Thread - 3 = 221.124.5.61:4931
 Thread - 4 = 104.221.129.39:7915
 Thread - 5 = 246.44.118.62:4726
 Thread - 6 = 160.77.254.255:6286
 Thread - 7 = 171.26.201.91:2231
 Thread - 0 = 225.242.148.30:6496
 Thread - 1 = 69.69.91.247:3993
 Thread - 2 = 221.158.98.172:3973
 Thread - 3 = 33.47.19.49:6924
 Thread - 4 = 10.38.190.116:1289
 Thread - 5 = 96.137.78.130:7030
 Thread - 6 = 241.104.222.39:6230
 Thread - 7 = 222.36.129.137:2738
 Thread - 0 = 165.86.207.13:8129
 Thread - 1 = 221.15.38.69:4244
 Thread - 2 = 105.75.231.245:4692
 Thread - 3 = 200.111.101.98:6018
 Thread - 4 = 231.86.207.171:5513
 Thread - 5 = 101.32.101.97:8327
 Thread - 6 = 23.122.79.185:7959
 Thread - 7 = 90.89.126.74:2225
 Thread - 0 = 71.247.18.36:6695
 Thread - 1 = 204.166.232.26:3219
 Thread - 2 = 41.4.57.160:6013
 Thread - 3 = 0.48.10.55:1874
 Thread - 4 = 32.101.158.50:8906
 Thread - 5 = 23.57.237.33:6212
 Thread - 6 = 175.93.139.59:1249
 Thread - 7 = 73.60.43.162:5157
 Thread - 0 = 85.120.199.139:7905
 Thread - 1 = 151.126.80.222:7722
 Thread - 2 = 187.219.244.67:8834
 Thread - 3 = 45.41.73.232:2605
 Thread - 4 = 32.191.148.208:2462
 Thread - 5 = 54.100.34.149:3002
 Thread - 6 = 189.222.139.217:1163
 Thread - 7 = 51.145.13.2:3110
 Thread - 0 = 118.248.215.181:8197
 Thread - 1 = 133.49.43.180:3277
 Thread - 2 = 190.198.178.105:8975
 Thread - 3 = 234.221.244.86:7956
 Thread - 4 = 110.63.74.72:1399
 Thread - 5 = 66.108.128.195:3555
 Thread - 6 = 81.138.204.3:6295
 Thread - 7 = 161.52.157.67:6252
 Thread - 0 = 187.49.246.14:4233
 Thread - 1 = 4.102.131.119:7826
 Thread - 2 = 138.54.204.148:1483
 Thread - 3 = 172.93.248.93:5389
 Thread - 4 = 167.249.128.45:8266
 Thread - 5 = 245.6.108.124:3552
 Thread - 6 = 53.0.188.240:1131
 Thread - 7 = 55.111.109.196:5283
 Thread - 0 = 223.37.173.46:5854
 Thread - 1 = 111.159.99.90:5308
 Thread - 2 = 135.16.15.107:4539
 Thread - 3 = 122.108.101.90:5721
 Thread - 4 = 43.71.188.72:7661
 Thread - 5 = 142.20.80.29:2729
 Thread - 6 = 181.139.169.64:5710
 Thread - 7 = 211.178.123.209:5720

...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935736
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Какой ужас. У вас все засинхронизировпно. О какой параллельности может идти речь. Это яркий пример как делать не нужно...
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935739
X-Cite,

Неверно. По результатам можно просмотреть что всё идёт синхронизировано. Конечно же функцию parseIp надо убрать в функцию вложения потока. Но в принципе для примера очень годный пример.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935740
X-Cite,

Грубо говоря в этом топике, все льют воду, не смотря на счётчик. Не объясняя тс-у как правильно работать с данными в потоке, как ичто передавать. Как и что возвращать.


Изначально он создал ведь тему, из за того что не понимал как массив- стринг передать в поток. И так далее.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935743
X-Cite,

вы думаете это я так красиво ручками оформил Для форума ?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
 Thread - 0 = 15.196.162.148:1453
 Thread - 1 = 238.165.4.197:4998
 Thread - 2 = 194.144.15.175:8174
 Thread - 3 = 112.65.239.49:8349
 Thread - 4 = 38.149.113.27:2927
 Thread - 5 = 5.98.208.59:3054
 Thread - 6 = 83.7.181.61:4386
 Thread - 7 = 49.252.241.14:8757
 Thread - 8 = 234.143.67.216:6029



Нет, увы. Это он синхронно отработал все потоки.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935746
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
ВсеРазумный,

Какой ужас. У вас все засинхронизировпно. О какой параллельности может идти речь. Это яркий пример как делать не нужно...


К сожалению, сейчас в интернете очень сложно найти нормальные статьи по многопоточному программированию в Delphi, зато примеров таких шедевров полно.
Есть Тейксейра с Пачекой, но там лишь основы. Видимо, этого сегодня недостаточно.

Грустно :(
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935748
DmSer,

А вы пользуетесь логикой - лучше воду лить? Давайте, приведите правильный пример. Хотя если бы могли,давно привели.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935749
Вы хоть то сами понимаете суть потоков ? Смысла потока запустить, обработать какие - то данные. И вернуть данные в главный поток.


Нет, вы этого не понимаете. Не понимаете что все потоки работают синхронно. Что свидетельствует опять же вывод




ВсеРазумный
X-Cite,

вы думаете это я так красиво ручками оформил Для форума ?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
 Thread - 0 = 15.196.162.148:1453
 Thread - 1 = 238.165.4.197:4998
 Thread - 2 = 194.144.15.175:8174
 Thread - 3 = 112.65.239.49:8349
 Thread - 4 = 38.149.113.27:2927
 Thread - 5 = 5.98.208.59:3054
 Thread - 6 = 83.7.181.61:4386
 Thread - 7 = 49.252.241.14:8757
 Thread - 8 = 234.143.67.216:6029



Нет, увы. Это он синхронно отработал все потоки.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935751
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Не понимаете что все потоки работают синхронно.
Не все. Только потоки "избранных".
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935752
YuRock,

Не смеши мои носки

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Threading, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Memo3: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    procedure NewThread(const s: TStrings; Index, Offset, Max: NativeUInt);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.NewThread(const s: TStrings; Index, Offset, Max: NativeUInt);
  function GetOffsetStings(): TArray<string>;
  var
    i: NativeUInt;
  begin
    SetLength(Result, Max);
    for i := 0 to Max - 1 do
      Result[i] := s.Strings[Offset + i];
  end;

var
  Arr: TArray<string>;
  i: Integer;
begin
  Arr := GetOffsetStings();

  Memo3.Lines.Add('Thread ' + Index.ToString + ' lines : ');
  for i := Low(Arr) to High(Arr) do
    Memo3.Lines.Add(Arr[i]);
  Memo3.Lines.Add('');

  TThread.CreateAnonymousThread(
    procedure()
    var
      i: Cardinal;
    begin
      for i := Low(Arr) to High(Arr) do
      begin
        TThread.Synchronize(nil,
          procedure procedure parseIp(const s: string; out ip, port: string);
          var
            i: Integer;
            b: Boolean;
          begin
            b := false;
            for i := Low(s) to High(s) do
            begin
              if not b then
                if s[i] = ':' then
                begin
                  b := true;
                  continue;
                end;

              if b then
                port := port + s[i]
              else
                ip := ip + s[i];
            end;
          end;
          var
            ip, port: string;
          begin
            parseIp(Arr[i], ip, port);
            Memo2.Lines.Add(TimeToStr(Time) + ' - ' + Index.ToString + ' = ' + ip + ':' + port);
          end);
      end;

    end).start;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i, rest, num, sum, count, NumThreads: Integer;
begin
  NumThreads := 8;

  num := Memo1.Lines.count;
  rest := num mod NumThreads;
  sum := num - rest;

  count := sum div NumThreads;

  for i := 0 to NumThreads - 1 do
  begin
    dec(sum, count);

    NewThread(Memo1.Lines, i, i * count, count);

    if (sum <= 0) and (rest >= 1) then
      NewThread(Memo1.Lines, i + 1, (i * count) + count, rest);
  end;
end;

end.




Код: sql
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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
23:41:55 - 0 = 246.152.137.89:2012
23:41:55 - 1 = 110.222.57.40:3929
23:41:55 - 2 = 184.117.125.112:5145
23:41:55 - 3 = 101.8.205.218:7633
23:41:55 - 4 = 8.116.122.87:6327
23:41:55 - 5 = 190.7.224.17:2363
23:41:55 - 6 = 157.197.224.163:2518
23:41:55 - 7 = 119.250.193.22:7074
23:41:55 - 8 = 161.193.179.175:6777
23:41:55 - 0 = 18.197.250.246:5569
23:41:55 - 1 = 230.65.168.71:6427
23:41:55 - 2 = 226.250.195.201:4020
23:41:55 - 3 = 41.77.211.116:6985
23:41:55 - 4 = 210.254.98.82:2229
23:41:55 - 5 = 244.14.44.67:4514
23:41:55 - 6 = 196.15.222.12:7911
23:41:55 - 7 = 222.110.147.21:8809
23:41:55 - 8 = 188.150.69.240:1046
23:41:55 - 0 = 90.75.62.52:5740
23:41:55 - 1 = 33.50.110.139:7909
23:41:55 - 2 = 182.210.114.32:2521
23:41:55 - 3 = 137.63.40.243:8241
23:41:55 - 4 = 31.131.147.82:1566
23:41:55 - 5 = 131.253.109.136:3923
23:41:55 - 6 = 162.172.45.54:5398
23:41:55 - 7 = 24.143.76.33:5756
23:41:55 - 8 = 223.238.33.146:8986
23:41:55 - 0 = 15.196.162.148:1453
23:41:55 - 1 = 238.165.4.197:4998
23:41:55 - 2 = 194.144.15.175:8174
23:41:55 - 3 = 112.65.239.49:8349
23:41:55 - 4 = 38.149.113.27:2927
23:41:55 - 5 = 5.98.208.59:3054
23:41:55 - 6 = 83.7.181.61:4386
23:41:55 - 7 = 49.252.241.14:8757
23:41:55 - 8 = 234.143.67.216:6029
23:41:55 - 0 = 152.80.85.207:7255
23:41:55 - 1 = 232.217.116.10:3714
23:41:55 - 2 = 125.161.152.157:1466
23:41:55 - 3 = 221.124.5.61:4931
23:41:55 - 4 = 104.221.129.39:7915
23:41:55 - 5 = 246.44.118.62:4726
23:41:55 - 6 = 160.77.254.255:6286
23:41:55 - 7 = 171.26.201.91:2231
23:41:55 - 0 = 225.242.148.30:6496
23:41:55 - 1 = 69.69.91.247:3993
23:41:55 - 2 = 221.158.98.172:3973
23:41:55 - 3 = 33.47.19.49:6924
23:41:55 - 4 = 10.38.190.116:1289
23:41:55 - 5 = 96.137.78.130:7030
23:41:55 - 6 = 241.104.222.39:6230
23:41:55 - 7 = 222.36.129.137:2738
23:41:55 - 0 = 165.86.207.13:8129
23:41:55 - 1 = 221.15.38.69:4244
23:41:55 - 2 = 105.75.231.245:4692
23:41:55 - 3 = 200.111.101.98:6018
23:41:55 - 4 = 231.86.207.171:5513
23:41:55 - 5 = 101.32.101.97:8327
23:41:55 - 6 = 23.122.79.185:7959
23:41:55 - 7 = 90.89.126.74:2225
23:41:55 - 0 = 71.247.18.36:6695
23:41:55 - 1 = 204.166.232.26:3219
23:41:55 - 2 = 41.4.57.160:6013
23:41:55 - 3 = 0.48.10.55:1874
23:41:55 - 4 = 32.101.158.50:8906
23:41:55 - 5 = 23.57.237.33:6212
23:41:55 - 6 = 175.93.139.59:1249
23:41:55 - 7 = 73.60.43.162:5157
23:41:55 - 0 = 85.120.199.139:7905
23:41:55 - 1 = 151.126.80.222:7722
23:41:55 - 2 = 187.219.244.67:8834
23:41:55 - 3 = 45.41.73.232:2605
23:41:55 - 4 = 32.191.148.208:2462
23:41:55 - 5 = 54.100.34.149:3002
23:41:55 - 6 = 189.222.139.217:1163
23:41:55 - 7 = 51.145.13.2:3110
23:41:55 - 0 = 118.248.215.181:8197
23:41:55 - 1 = 133.49.43.180:3277
23:41:55 - 2 = 190.198.178.105:8975
23:41:55 - 3 = 234.221.244.86:7956
23:41:55 - 4 = 110.63.74.72:1399
23:41:55 - 5 = 66.108.128.195:3555
23:41:55 - 6 = 81.138.204.3:6295
23:41:55 - 7 = 161.52.157.67:6252
23:41:55 - 0 = 187.49.246.14:4233
23:41:55 - 1 = 4.102.131.119:7826
23:41:55 - 2 = 138.54.204.148:1483
23:41:55 - 3 = 172.93.248.93:5389
23:41:55 - 4 = 167.249.128.45:8266
23:41:55 - 5 = 245.6.108.124:3552
23:41:55 - 6 = 53.0.188.240:1131
23:41:55 - 7 = 55.111.109.196:5283
23:41:55 - 0 = 223.37.173.46:5854
23:41:55 - 1 = 111.159.99.90:5308
23:41:55 - 2 = 135.16.15.107:4539
23:41:55 - 3 = 122.108.101.90:5721
23:41:55 - 4 = 43.71.188.72:7661
23:41:55 - 5 = 142.20.80.29:2729
23:41:55 - 6 = 181.139.169.64:5710
23:41:55 - 7 = 211.178.123.209:5720
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935753
Я подумал глупо выводит в секундах, выведем всё и целиком ! Что бы было нагляднее

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Threading, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Memo3: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    procedure NewThread(const s: TStrings; Index, Offset, Max: NativeUInt);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.NewThread(const s: TStrings; Index, Offset, Max: NativeUInt);
  function GetOffsetStings(): TArray<string>;
  var
    i: NativeUInt;
  begin
    SetLength(Result, Max);
    for i := 0 to Max - 1 do
      Result[i] := s.Strings[Offset + i];
  end;

var
  Arr: TArray<string>;
  i: Integer;
begin
  Arr := GetOffsetStings();

  Memo3.Lines.Add('Thread ' + Index.ToString + ' lines : ');
  for i := Low(Arr) to High(Arr) do
    Memo3.Lines.Add(Arr[i]);
  Memo3.Lines.Add('');

  TThread.CreateAnonymousThread(
    procedure()
    var
      i: Cardinal;
    begin
      for i := Low(Arr) to High(Arr) do
      begin
        TThread.Synchronize(nil,
          procedure procedure parseIp(const s: string; out ip, port: string);
          var
            i: Integer;
            b: Boolean;
          begin
            b := false;
            for i := Low(s) to High(s) do
            begin
              if not b then
                if s[i] = ':' then
                begin
                  b := true;
                  continue;
                end;

              if b then
                port := port + s[i]
              else
                ip := ip + s[i];
            end;
          end;
          var
            ip, port: string;
          begin
            parseIp(Arr[i], ip, port);
            Memo2.Lines.Add(Double(Time).ToString + ' - ' + Index.ToString + ' = ' + ip + ':' + port);
          end);
      end;

    end).start;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i, rest, num, sum, count, NumThreads: Integer;
begin
  NumThreads := 8;

  num := Memo1.Lines.count;
  rest := num mod NumThreads;
  sum := num - rest;

  count := sum div NumThreads;

  for i := 0 to NumThreads - 1 do
  begin
    dec(sum, count);

    NewThread(Memo1.Lines, i, i * count, count);

    if (sum <= 0) and (rest >= 1) then
      NewThread(Memo1.Lines, i + 1, (i * count) + count, rest);
  end;
end;

end.




Код: sql
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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
0,988730868055556 - 0 = 246.152.137.89:2012
0,988730868055556 - 1 = 110.222.57.40:3929
0,988730868055556 - 2 = 184.117.125.112:5145
0,988730868055556 - 3 = 101.8.205.218:7633
0,988730868055556 - 4 = 8.116.122.87:6327
0,988730868055556 - 5 = 190.7.224.17:2363
0,988730868055556 - 6 = 157.197.224.163:2518
0,988730868055556 - 7 = 119.250.193.22:7074

0,988731053240741 - 8 = 161.193.179.175:6777
0,988731053240741 - 0 = 18.197.250.246:5569
0,988731053240741 - 1 = 230.65.168.71:6427
0,988731053240741 - 2 = 226.250.195.201:4020

0,988731134259259 - 3 = 41.77.211.116:6985
0,988731134259259 - 4 = 210.254.98.82:2229
0,988731134259259 - 5 = 244.14.44.67:4514
0,988731134259259 - 6 = 196.15.222.12:7911
0,988731134259259 - 7 = 222.110.147.21:8809
0,988731134259259 - 8 = 188.150.69.240:1046
0,988731134259259 - 0 = 90.75.62.52:5740

0,988731319444444 - 1 = 33.50.110.139:7909
0,988731319444444 - 2 = 182.210.114.32:2521
0,988731319444444 - 3 = 137.63.40.243:8241
0,988731319444444 - 4 = 31.131.147.82:1566
0,988731319444444 - 5 = 131.253.109.136:3923

0,988731493055556 - 6 = 162.172.45.54:5398
0,988731493055556 - 7 = 24.143.76.33:5756
0,988731493055556 - 8 = 223.238.33.146:8986
0,988731493055556 - 0 = 15.196.162.148:1453
0,988731493055556 - 1 = 238.165.4.197:4998
0,988731493055556 - 2 = 194.144.15.175:8174

0,988731678240741 - 3 = 112.65.239.49:8349
0,988731678240741 - 4 = 38.149.113.27:2927
0,988731678240741 - 5 = 5.98.208.59:3054
0,988731678240741 - 6 = 83.7.181.61:4386
0,988731678240741 - 7 = 49.252.241.14:8757

0,988731851851852 - 8 = 234.143.67.216:6029
0,988731851851852 - 0 = 152.80.85.207:7255

0,988732037037037 - 1 = 232.217.116.10:3714
0,988732037037037 - 2 = 125.161.152.157:1466
0,988732037037037 - 3 = 221.124.5.61:4931
0,988732037037037 - 4 = 104.221.129.39:7915

0,988732222222222 - 5 = 246.44.118.62:4726
0,988732222222222 - 6 = 160.77.254.255:6286
0,988732222222222 - 7 = 171.26.201.91:2231

0,988732291666667 - 0 = 225.242.148.30:6496
0,988732291666667 - 1 = 69.69.91.247:3993
0,988732291666667 - 2 = 221.158.98.172:3973
0,988732291666667 - 3 = 33.47.19.49:6924
0,988732291666667 - 4 = 10.38.190.116:1289

0,988732476851852 - 5 = 96.137.78.130:7030
0,988732476851852 - 6 = 241.104.222.39:6230
0,988732476851852 - 7 = 222.36.129.137:2738
0,988732476851852 - 0 = 165.86.207.13:8129
0,988732476851852 - 1 = 221.15.38.69:4244

0,988732662037037 - 2 = 105.75.231.245:4692
0,988732662037037 - 3 = 200.111.101.98:6018
0,988732662037037 - 4 = 231.86.207.171:5513
0,988732662037037 - 5 = 101.32.101.97:8327
0,988732662037037 - 6 = 23.122.79.185:7959
0,988732662037037 - 7 = 90.89.126.74:2225

0,988732835648148 - 0 = 71.247.18.36:6695
0,988732835648148 - 1 = 204.166.232.26:3219
0,988732835648148 - 2 = 41.4.57.160:6013
0,988732835648148 - 3 = 0.48.10.55:1874
0,988732835648148 - 4 = 32.101.158.50:8906

0,988733020833333 - 5 = 23.57.237.33:6212
0,988733020833333 - 6 = 175.93.139.59:1249
0,988733020833333 - 7 = 73.60.43.162:5157
0,988733020833333 - 0 = 85.120.199.139:7905
0,988733020833333 - 1 = 151.126.80.222:7722

0,988733206018519 - 2 = 187.219.244.67:8834
0,988733206018519 - 3 = 45.41.73.232:2605
0,988733206018519 - 4 = 32.191.148.208:2462
0,988733206018519 - 5 = 54.100.34.149:3002
0,988733206018519 - 6 = 189.222.139.217:1163
0,988733206018519 - 7 = 51.145.13.2:3110

0,98873337962963 - 0 = 118.248.215.181:8197
0,98873337962963 - 1 = 133.49.43.180:3277

0,988733460648148 - 2 = 190.198.178.105:8975
0,988733460648148 - 3 = 234.221.244.86:7956
0,988733460648148 - 4 = 110.63.74.72:1399
0,988733460648148 - 5 = 66.108.128.195:3555
0,988733460648148 - 6 = 81.138.204.3:6295

0,988733645833333 - 7 = 161.52.157.67:6252
0,988733645833333 - 0 = 187.49.246.14:4233
0,988733645833333 - 1 = 4.102.131.119:7826
0,988733645833333 - 2 = 138.54.204.148:1483
0,988733645833333 - 3 = 172.93.248.93:5389
0,988733645833333 - 4 = 167.249.128.45:8266

0,988733819444444 - 5 = 245.6.108.124:3552
0,988733819444444 - 6 = 53.0.188.240:1131
0,988733819444444 - 7 = 55.111.109.196:5283
0,988733819444444 - 0 = 223.37.173.46:5854
0,988733819444444 - 1 = 111.159.99.90:5308

0,98873400462963 - 2 = 135.16.15.107:4539
0,988734189814815 - 3 = 122.108.101.90:5721
0,988734363425926 - 4 = 43.71.188.72:7661
0,988734548611111 - 5 = 142.20.80.29:2729
0,98873462962963 - 6 = 181.139.169.64:5710
0,988734803240741 - 7 = 211.178.123.209:5720




Кое где не совсем точно, но это погрешность, ибо при нескольких запусках там может быть
Код: sql
1.
2.
3.
0,990460949074074 - 5 = 142.20.80.29:2729
0,990460949074074 - 6 = 181.139.169.64:5710
0,990460949074074 - 7 = 211.178.123.209:5720



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

А вы пользуетесь логикой - лучше воду лить? Давайте, приведите правильный пример. Хотя если бы могли,давно привели.


Для Вас я приводить ничего не буду, Вы и сами все знаете лучше всех. С Архангельским небось знакомы.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935756
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный


Нет, вы этого не понимаете. Не понимаете что все потоки работают синхронно.


Не понимаю...
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935757
DmSer,

Ну я вообще сомневаюсь, что вы что - то можете привести.

...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935760
Фотография 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
 TMyThread = class(TThread)
  public
    MyIndex: Byte;
    IP,Port:string;
  protected
    procedure sync;
    procedure execute;
  end;

var
  Form1: TForm1;
  ProxyList: TStringList;
  ptk: array [1 .. 10] of TMyThread; // ПОТОКИ
  WORK: Boolean;  
  Proxy_tic: Integer; 
  CS: TCriticalSection; // КРИТИЧЕСКАЯ СЕКЦИЯ
  
  
  
  
  {Запуск потоков}
  var
  i: Integer;
begin
  WORK := True;
  Proxy_tic := -1; // переменной присваиваю -1, так как в потоке первым делом она Inc(), и будет ровняться 0
  for i := 1 to StrToInt(sTrackEdit1.Text) do // количество потоков
  begin
    ptk[i] := TMyThread.Create(True);
    ptk[i].FreeOnTerminate := True;
    ptk[i].Priority := tpNormal;
    ptk[i].Resume;
  end;
end;
  
  
  
  { TMyThread }

procedure TMyThread.execute;
var
  Position: Integer;
begin
  while WORK do
  begin
    Inc(Proxy_tic); // увеличиваю переменную
    CS.Enter; // крит секция
    if Proxy_tic < ProxyList.Count then // если переменная меньше чем строк в стринглисте
    begin
     MyIndex := Proxy_tic;  // присваиваю переменной потока нужное значение
    end
    else
    begin
      WORK := False;
    end;
    CS.Leave;

    Position := Pos(':', ProxyList.Strings[MyIndex]);  // НАХОЖУ РАЗДЕЛИТЕЛЬ :  
     IP := Copy(ProxyList.Strings[MyIndex], 0, Position -1); //   БЕРУ АЙПИ 
     Port := Copy(ProxyList.Strings[MyIndex], Position +1, ProxyList.Strings[MyIndex].Length); // И ПОРТ
     Synchronize(sync);
  end;

end;

procedure TMyThread.sync;
begin
  Form1.sMemo1.Lines.Add(IntToStr(MyIndex) + IP + Port) ; 
end;

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

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

И что у вас не работает?

Тот код что выше, должен по моей логике в мемо добавлять строки. Номер строки, айпи и порт.
Но ничего не происходит.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935764
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Воспользоваться отладкой не предлогать? ;)

Брэйкпоинт оставить на старте .execute, например.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935765
rgreat,

вставил его код, на втором цикле создания TMyThread выкидывает
Код: pascal
1.
2.
3.
4.
procedure AbstractErrorHandler;
begin
  raise EAbstractError.CreateRes(@SAbstractError);
end;




http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1392
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935766
rgreat,
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935767
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Я в его коде-огрызке даже инициализации ProxyList и CS не вижу.

Мне надо медиумом заделаться что бы понять что он там еще накосячил?
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935769
rgreat,

ой да что там, 2-3 секунды вкинуть в среду данный код. Вот консольный вариант с ошибкой AbstractErrorHandler при вызове Resume на втором круге

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils, System.Classes, System.Threading, SyncObjs;

type
  TMyThread = class(TThread)
  public
    MyIndex: Byte;
    IP, Port: string;
  protected
    procedure sync;
    procedure execute;
  end;

var
  ptk: array [1 .. 10] of TMyThread;

procedure Test();
var
  i: Integer;
begin
  for i := Low(ptk) to High(ptk) do
  begin
    ptk[i] := TMyThread.Create(True);
    ptk[i].FreeOnTerminate := True;
    ptk[i].Priority := tpNormal;
    ptk[i].Resume;
  end;
end;

procedure TMyThread.sync;
begin

end;

procedure TMyThread.execute;
begin

end;

begin
  try
    Test();
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.



Ну и если поменять в конструкторе с false на true и убрать Resume ничего не меняется.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935770
Фотография Tech N9ne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм))
Недоглядел, забыл CS := TCriticalSection.Create; написать.
Теперь вроде всё работает
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935772
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
rgreat,

ой да что там, 2-3 секунды вкинуть в среду данный код. Вот консольный вариант с ошибкой AbstractErrorHandler при вызове Resume на втором круге


procedure Execute; override;
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935773
rgreat,

а по итогу полная белиберда, не считая пинков под зад за обращение к компонентам из потока

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils, System.Classes, System.Threading, SyncObjs;

type
  TMyThread = class(TThread)
  public
    MyIndex: Byte;
    IP, Port: string;
  protected
    procedure sync;
    procedure execute;
  end;

var
  ptk: array [1 .. 10] of TMyThread;
  ProxyList: TStringList;
// threadvar
  Proxy_tic: Integer;

procedure Test();
var
  i: Integer;
begin
  for i := Low(ptk) to High(ptk) do
  begin
    ptk[i] := TMyThread.Create(True);
    ptk[i].FreeOnTerminate := True;
    ptk[i].Priority := tpNormal;
    ptk[i].execute;
  end;
end;

procedure TMyThread.execute;
var
  Position: Integer;
  WORK: Boolean;
begin
  WORK := True;
  while WORK do
  begin
    Inc(Proxy_tic); // увеличиваю переменную

    if Proxy_tic < ProxyList.Count then // если переменная меньше чем строк в стринглисте
    begin
      MyIndex := Proxy_tic; // присваиваю переменной потока нужное значение
    end
    else
    begin
      WORK := False;
    end;

    Position := Pos(':', ProxyList.Strings[MyIndex]); // НАХОЖУ РАЗДЕЛИТЕЛЬ :
    IP := Copy(ProxyList.Strings[MyIndex], 0, Position - 1); // БЕРУ АЙПИ
    Port := Copy(ProxyList.Strings[MyIndex], Position + 1, ProxyList.Strings[MyIndex].Length); // И ПОРТ
    Synchronize(sync);
  end;

end;

procedure TMyThread.sync;
begin
  Writeln(IntToStr(MyIndex) + ' - ' + IP + ':' + Port);
end;

begin
  try
    ProxyList := TStringList.Create;
    ProxyList.Add('246.152.137.89:2012');
    ProxyList.Add('18.197.250.246:5569');
    ProxyList.Add('90.75.62.52:5740');
    ProxyList.Add('15.196.162.148:1453');
    ProxyList.Add('152.80.85.207:7255');
    ProxyList.Add('225.242.148.30:6496');
    ProxyList.Add('165.86.207.13:8129');
    ProxyList.Add('71.247.18.36:6695');
    ProxyList.Add('85.120.199.139:7905');
    ProxyList.Add('118.248.215.181:8197');
    ProxyList.Add('187.49.246.14:4233');
    ProxyList.Add('223.37.173.46:5854');
    ProxyList.Add('110.222.57.40:3929');
    ProxyList.Add('230.65.168.71:6427');
    ProxyList.Add('33.50.110.139:7909');
    ProxyList.Add('238.165.4.197:4998');
    ProxyList.Add('232.217.116.10:3714');
    ProxyList.Add('69.69.91.247:3993');
    ProxyList.Add('221.15.38.69:4244');
    ProxyList.Add('204.166.232.26:3219');
    ProxyList.Add('151.126.80.222:7722');
    ProxyList.Add('133.49.43.180:3277');
    ProxyList.Add('4.102.131.119:7826');
    ProxyList.Add('111.159.99.90:5308');
    ProxyList.Add('184.117.125.112:5145');
    ProxyList.Add('226.250.195.201:4020');
    ProxyList.Add('182.210.114.32:2521');
    ProxyList.Add('194.144.15.175:8174');
    ProxyList.Add('125.161.152.157:1466');
    ProxyList.Add('221.158.98.172:3973');
    ProxyList.Add('105.75.231.245:4692');
    ProxyList.Add('41.4.57.160:6013');
    ProxyList.Add('187.219.244.67:8834');
    ProxyList.Add('190.198.178.105:8975');
    ProxyList.Add('138.54.204.148:1483');
    ProxyList.Add('135.16.15.107:4539');
    ProxyList.Add('101.8.205.218:7633');
    ProxyList.Add('41.77.211.116:6985');
    ProxyList.Add('137.63.40.243:8241');
    ProxyList.Add('112.65.239.49:8349');
    ProxyList.Add('221.124.5.61:4931');
    ProxyList.Add('33.47.19.49:6924');
    ProxyList.Add('200.111.101.98:6018');
    ProxyList.Add('0.48.10.55:1874');
    ProxyList.Add('45.41.73.232:2605');
    ProxyList.Add('234.221.244.86:7956');
    ProxyList.Add('172.93.248.93:5389');
    ProxyList.Add('122.108.101.90:5721');
    ProxyList.Add('8.116.122.87:6327');
    ProxyList.Add('210.254.98.82:2229');
    ProxyList.Add('31.131.147.82:1566');
    ProxyList.Add('38.149.113.27:2927');
    ProxyList.Add('104.221.129.39:7915');
    ProxyList.Add('10.38.190.116:1289');
    ProxyList.Add('231.86.207.171:5513');
    ProxyList.Add('32.101.158.50:8906');
    ProxyList.Add('32.191.148.208:2462');
    ProxyList.Add('110.63.74.72:1399');
    ProxyList.Add('167.249.128.45:8266');
    ProxyList.Add('43.71.188.72:7661');
    ProxyList.Add('190.7.224.17:2363');
    ProxyList.Add('244.14.44.67:4514');
    ProxyList.Add('131.253.109.136:3923');
    ProxyList.Add('5.98.208.59:3054');
    ProxyList.Add('246.44.118.62:4726');
    ProxyList.Add('96.137.78.130:7030');
    ProxyList.Add('101.32.101.97:8327');
    ProxyList.Add('23.57.237.33:6212');
    ProxyList.Add('54.100.34.149:3002');
    ProxyList.Add('66.108.128.195:3555');
    ProxyList.Add('245.6.108.124:3552');
    ProxyList.Add('142.20.80.29:2729');
    ProxyList.Add('157.197.224.163:2518');
    ProxyList.Add('196.15.222.12:7911');
    ProxyList.Add('162.172.45.54:5398');
    ProxyList.Add('83.7.181.61:4386');
    ProxyList.Add('160.77.254.255:6286');
    ProxyList.Add('241.104.222.39:6230');
    ProxyList.Add('23.122.79.185:7959');
    ProxyList.Add('175.93.139.59:1249');
    ProxyList.Add('189.222.139.217:1163');
    ProxyList.Add('81.138.204.3:6295');
    ProxyList.Add('53.0.188.240:1131');
    ProxyList.Add('181.139.169.64:5710');
    ProxyList.Add('119.250.193.22:7074');
    ProxyList.Add('222.110.147.21:8809');
    ProxyList.Add('24.143.76.33:5756');
    ProxyList.Add('49.252.241.14:8757');
    ProxyList.Add('171.26.201.91:2231');
    ProxyList.Add('222.36.129.137:2738');
    ProxyList.Add('90.89.126.74:2225');
    ProxyList.Add('73.60.43.162:5157');
    ProxyList.Add('51.145.13.2:3110');
    ProxyList.Add('161.52.157.67:6252');
    ProxyList.Add('55.111.109.196:5283');
    ProxyList.Add('211.178.123.209:5720');
    ProxyList.Add('161.193.179.175:6777');
    ProxyList.Add('188.150.69.240:1046');
    ProxyList.Add('223.238.33.146:8986');
    ProxyList.Add('234.143.67.216:6029');

    Test();
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.




out
Код: sql
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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
1 - 18.197.250.246:5569
2 - 90.75.62.52:5740
3 - 15.196.162.148:1453
4 - 152.80.85.207:7255
5 - 225.242.148.30:6496
6 - 165.86.207.13:8129
7 - 71.247.18.36:6695
8 - 85.120.199.139:7905
9 - 118.248.215.181:8197
10 - 187.49.246.14:4233
11 - 223.37.173.46:5854
12 - 110.222.57.40:3929
13 - 230.65.168.71:6427
14 - 33.50.110.139:7909
15 - 238.165.4.197:4998
16 - 232.217.116.10:3714
17 - 69.69.91.247:3993
18 - 221.15.38.69:4244
19 - 204.166.232.26:3219
20 - 151.126.80.222:7722
21 - 133.49.43.180:3277
22 - 4.102.131.119:7826
23 - 111.159.99.90:5308
24 - 184.117.125.112:5145
25 - 226.250.195.201:4020
26 - 182.210.114.32:2521
27 - 194.144.15.175:8174
28 - 125.161.152.157:1466
29 - 221.158.98.172:3973
30 - 105.75.231.245:4692
31 - 41.4.57.160:6013
32 - 187.219.244.67:8834
33 - 190.198.178.105:8975
34 - 138.54.204.148:1483
35 - 135.16.15.107:4539
36 - 101.8.205.218:7633
37 - 41.77.211.116:6985
38 - 137.63.40.243:8241
39 - 112.65.239.49:8349
40 - 221.124.5.61:4931
41 - 33.47.19.49:6924
42 - 200.111.101.98:6018
43 - 0.48.10.55:1874
44 - 45.41.73.232:2605
45 - 234.221.244.86:7956
46 - 172.93.248.93:5389
47 - 122.108.101.90:5721
48 - 8.116.122.87:6327
49 - 210.254.98.82:2229
50 - 31.131.147.82:1566
51 - 38.149.113.27:2927
52 - 104.221.129.39:7915
53 - 10.38.190.116:1289
54 - 231.86.207.171:5513
55 - 32.101.158.50:8906
56 - 32.191.148.208:2462
57 - 110.63.74.72:1399
58 - 167.249.128.45:8266
59 - 43.71.188.72:7661
60 - 190.7.224.17:2363
61 - 244.14.44.67:4514
62 - 131.253.109.136:3923
63 - 5.98.208.59:3054
64 - 246.44.118.62:4726
65 - 96.137.78.130:7030
66 - 101.32.101.97:8327
67 - 23.57.237.33:6212
68 - 54.100.34.149:3002
69 - 66.108.128.195:3555
70 - 245.6.108.124:3552
71 - 142.20.80.29:2729
72 - 157.197.224.163:2518
73 - 196.15.222.12:7911
74 - 162.172.45.54:5398
75 - 83.7.181.61:4386
76 - 160.77.254.255:6286
77 - 241.104.222.39:6230
78 - 23.122.79.185:7959
79 - 175.93.139.59:1249
80 - 189.222.139.217:1163
81 - 81.138.204.3:6295
82 - 53.0.188.240:1131
83 - 181.139.169.64:5710
84 - 119.250.193.22:7074
85 - 222.110.147.21:8809
86 - 24.143.76.33:5756
87 - 49.252.241.14:8757
88 - 171.26.201.91:2231
89 - 222.36.129.137:2738
90 - 90.89.126.74:2225
91 - 73.60.43.162:5157
92 - 51.145.13.2:3110
93 - 161.52.157.67:6252
94 - 55.111.109.196:5283
95 - 211.178.123.209:5720
96 - 161.193.179.175:6777
97 - 188.150.69.240:1046
98 - 223.238.33.146:8986
99 - 234.143.67.216:6029
99 - 234.143.67.216:6029
0 - 246.152.137.89:2012
0 - 246.152.137.89:2012
0 - 246.152.137.89:2012
0 - 246.152.137.89:2012
0 - 246.152.137.89:2012
0 - 246.152.137.89:2012
0 - 246.152.137.89:2012
0 - 246.152.137.89:2012
0 - 246.152.137.89:2012

...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935774
В общем код то неверную смысловую нагрузку несёт. Мы должны задавать действия для потока, к примеру имеем базу Array[0..9999] of string и к примеру нам нужно 8 потоков, дабы пройтись по базе. Для этого мы должны разделить в ручную базу для каждого потока (А не выделить сразу кучу потоков на одну функцию, и ждать что всё пройдёт удачно. Кретинизм 100лвл).


Код: pascal
1.
2.
3.
4.
5.
6.
7.
  NumThreads := 8;

  num := Memo1.Lines.count; // 9999
  rest := num mod NumThreads; // 7
  sum := num - rest; // 9992

  count := sum div NumThreads; // 1249




То есть, на один поток приходиться 1249 записей. И остаточных 7 = 8 * 1249 = 9992 + 7 = 9999 итераций


Единственный и верный способ, выполнить разбор базы поточно, распределив действия по потокам равномерно. А не быть супер сонником который будет выхватывать из базы данные
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935775
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Тебя ptk[i].execute; вместо ptk[i].Start; не смутило?

Потоки в коде как бы вообще не запускаются. ;)
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935777
rgreat,

Меня многое смущает
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935779
rgreat,

а ты отредактировал сообщение. Да. Отладчик сходит сумма. Результатов нет.

Все признаки проблемы использования компонентов в потоке

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils, System.Classes, System.Threading, SyncObjs;

type
  TMyThread = class(TThread)
  public
    MyIndex: Integer;
    IP, Port: string;
  protected
    procedure sync;
    procedure execute; override;
  end;

var
  ptk: array [1 .. 10] of TMyThread;
  ProxyList: TStringList;

  Proxy_tic: Integer;

procedure Test();
var
  i: Integer;
begin
  for i := Low(ptk) to 5 do
  begin
    ptk[i] := TMyThread.Create(True);
    ptk[i].FreeOnTerminate := True;
    ptk[i].Priority := tpNormal;
    ptk[i].Start;
  end;
end;

procedure TMyThread.execute;
var
  Position: Integer;
  WORK: Boolean;
begin
  WORK := True;
  while WORK do
  begin
    Inc(Proxy_tic); // увеличиваю переменную

    if Proxy_tic < ProxyList.Count then // если переменная меньше чем строк в стринглисте
    begin
      MyIndex := Proxy_tic; // присваиваю переменной потока нужное значение
    end
    else
    begin
      WORK := False;
    end;

    Position := Pos(':', ProxyList.Strings[MyIndex]); // НАХОЖУ РАЗДЕЛИТЕЛЬ :
    IP := Copy(ProxyList.Strings[MyIndex], 0, Position - 1); // БЕРУ АЙПИ
    Port := Copy(ProxyList.Strings[MyIndex], Position + 1, ProxyList.Strings[MyIndex].Length); // И ПОРТ
    Synchronize(sync);
  end;

end;

procedure TMyThread.sync;
begin
  Writeln(IntToStr(MyIndex) + ' - ' + IP + ':' + Port);
end;

begin
  try
    ProxyList := TStringList.Create;
    ProxyList.Add('246.152.137.89:2012');
    ProxyList.Add('18.197.250.246:5569');
    ProxyList.Add('90.75.62.52:5740');
    ProxyList.Add('15.196.162.148:1453');
    ProxyList.Add('152.80.85.207:7255');
    ProxyList.Add('225.242.148.30:6496');
    ProxyList.Add('165.86.207.13:8129');
    ProxyList.Add('71.247.18.36:6695');
    ProxyList.Add('85.120.199.139:7905');
    ProxyList.Add('118.248.215.181:8197');
    ProxyList.Add('187.49.246.14:4233');
    ProxyList.Add('223.37.173.46:5854');
    ProxyList.Add('110.222.57.40:3929');
    ProxyList.Add('230.65.168.71:6427');
    ProxyList.Add('33.50.110.139:7909');
    ProxyList.Add('238.165.4.197:4998');
    ProxyList.Add('232.217.116.10:3714');
    ProxyList.Add('69.69.91.247:3993');
    ProxyList.Add('221.15.38.69:4244');
    ProxyList.Add('204.166.232.26:3219');
    ProxyList.Add('151.126.80.222:7722');
    ProxyList.Add('133.49.43.180:3277');
    ProxyList.Add('4.102.131.119:7826');
    ProxyList.Add('111.159.99.90:5308');
    ProxyList.Add('184.117.125.112:5145');
    ProxyList.Add('226.250.195.201:4020');
    ProxyList.Add('182.210.114.32:2521');
    ProxyList.Add('194.144.15.175:8174');
    ProxyList.Add('125.161.152.157:1466');
    ProxyList.Add('221.158.98.172:3973');
    ProxyList.Add('105.75.231.245:4692');
    ProxyList.Add('41.4.57.160:6013');
    ProxyList.Add('187.219.244.67:8834');
    ProxyList.Add('190.198.178.105:8975');
    ProxyList.Add('138.54.204.148:1483');
    ProxyList.Add('135.16.15.107:4539');
    ProxyList.Add('101.8.205.218:7633');
    ProxyList.Add('41.77.211.116:6985');
    ProxyList.Add('137.63.40.243:8241');
    ProxyList.Add('112.65.239.49:8349');
    ProxyList.Add('221.124.5.61:4931');
    ProxyList.Add('33.47.19.49:6924');
    ProxyList.Add('200.111.101.98:6018');
    ProxyList.Add('0.48.10.55:1874');
    ProxyList.Add('45.41.73.232:2605');
    ProxyList.Add('234.221.244.86:7956');
    ProxyList.Add('172.93.248.93:5389');
    ProxyList.Add('122.108.101.90:5721');
    ProxyList.Add('8.116.122.87:6327');
    ProxyList.Add('210.254.98.82:2229');
    ProxyList.Add('31.131.147.82:1566');
    ProxyList.Add('38.149.113.27:2927');
    ProxyList.Add('104.221.129.39:7915');
    ProxyList.Add('10.38.190.116:1289');
    ProxyList.Add('231.86.207.171:5513');
    ProxyList.Add('32.101.158.50:8906');
    ProxyList.Add('32.191.148.208:2462');
    ProxyList.Add('110.63.74.72:1399');
    ProxyList.Add('167.249.128.45:8266');
    ProxyList.Add('43.71.188.72:7661');
    ProxyList.Add('190.7.224.17:2363');
    ProxyList.Add('244.14.44.67:4514');
    ProxyList.Add('131.253.109.136:3923');
    ProxyList.Add('5.98.208.59:3054');
    ProxyList.Add('246.44.118.62:4726');
    ProxyList.Add('96.137.78.130:7030');
    ProxyList.Add('101.32.101.97:8327');
    ProxyList.Add('23.57.237.33:6212');
    ProxyList.Add('54.100.34.149:3002');
    ProxyList.Add('66.108.128.195:3555');
    ProxyList.Add('245.6.108.124:3552');
    ProxyList.Add('142.20.80.29:2729');
    ProxyList.Add('157.197.224.163:2518');
    ProxyList.Add('196.15.222.12:7911');
    ProxyList.Add('162.172.45.54:5398');
    ProxyList.Add('83.7.181.61:4386');
    ProxyList.Add('160.77.254.255:6286');
    ProxyList.Add('241.104.222.39:6230');
    ProxyList.Add('23.122.79.185:7959');
    ProxyList.Add('175.93.139.59:1249');
    ProxyList.Add('189.222.139.217:1163');
    ProxyList.Add('81.138.204.3:6295');
    ProxyList.Add('53.0.188.240:1131');
    ProxyList.Add('181.139.169.64:5710');
    ProxyList.Add('119.250.193.22:7074');
    ProxyList.Add('222.110.147.21:8809');
    ProxyList.Add('24.143.76.33:5756');
    ProxyList.Add('49.252.241.14:8757');
    ProxyList.Add('171.26.201.91:2231');
    ProxyList.Add('222.36.129.137:2738');
    ProxyList.Add('90.89.126.74:2225');
    ProxyList.Add('73.60.43.162:5157');
    ProxyList.Add('51.145.13.2:3110');
    ProxyList.Add('161.52.157.67:6252');
    ProxyList.Add('55.111.109.196:5283');
    ProxyList.Add('211.178.123.209:5720');
    ProxyList.Add('161.193.179.175:6777');
    ProxyList.Add('188.150.69.240:1046');
    ProxyList.Add('223.238.33.146:8986');
    ProxyList.Add('234.143.67.216:6029');

    Test();
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.

...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935780
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
rgreat,

а ты отредактировал сообщение. Да. Отладчик сходит сумма. Результатов нет.

Все признаки проблемы использования компонентов в потоке
Ты мои сообщения не читаешь?

И да, это не последняя проблема в этом кривейшем коде.

В общем хватит трахать мне мозг вашими кривыми и сломанными костылями.
Вот правильный подход.
Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils, System.Classes, System.Threading, SyncObjs;

begin
  var CS:=TCriticalSection.Create;
  var ProxyList:=TStringList.Create;
  try
    try
      for var i:=0 to 99 do begin
        ProxyList.Add(i.ToString+'.0.0.0:80');
      end;

      TParallel.&For(0, ProxyList.Count-1, procedure (i: integer)
      begin
      begin
        var Position := Pos(':', ProxyList.Strings[i]); // НАХОЖУ РАЗДЕЛИТЕЛЬ :
        var IP := Copy(ProxyList.Strings[i], 0, Position - 1); // БЕРУ АЙПИ
        var Port := Copy(ProxyList.Strings[i], Position + 1, ProxyList.Strings[i].Length); // И ПОРТ
        Sleep(Random(500)); // типа тут проверяем прокси
        CS.Enter;
        try
          Writeln(i.ToString + ' - ' + IP + ':' + Port); // выдаем результат так чтобы потоки друг другу не мешали.
          // для консолького ПО - через  TCriticalSection для "формочек" - через Synchronize.
        finally
          CS.Leave;
        end;
      end);
    except
      on E: Exception do
        Writeln(E.ClassName, ': ', E.Message);
    end;
  finally
    CS.Free;
    ProxyList.Free;
  end;

  Writeln('Done.');
  Readln;
end.

...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935781
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Один begin лишний.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935782
rgreat,

А ты читал вообще тему ? Читал вообще про TParallel.&For ? Ты не понял смысла данного цикла))))

Имеем
1) Потоки не запускает.
2) Потоки не делит.
3) Использует один пул, дожидаясь завершения.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935783
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Ты пишешь какие-то слова не имеющие смысла.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935785
rgreat,

значит ты не компетентная личность в данном вопросе, раз не знаешь как выполняется данная функция



Вот кстати пример
https://github.com/marvinbraga/FiremonkeyMDL/blob/00ce79851bf699626091f5c768572bc14a5b87c4/Marvin.Comps.MDL.Frame.Button.RaisedFlat.pas#L573

Или вот
Код: 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.
function test(count: integer): integer;
var
  tasks: array of ITask;
  val: integer;
begin
  val := 0;

  SetLength(tasks, count);
  TParallel.For(Low(tasks), High(tasks),
    procedure(i: integer)
    begin
      tasks[i] := TTask.Create(
        procedure()
        begin
          TInterlocked.Add(val, Random(10));
        end);
      tasks[i].Start;
    end);

  // Подождём ответ
  TTask.WaitForAll(tasks);

  Result := val;
end;




А не так, как ты себе придумал
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935786
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Ты бы хоть протестировал мой пример перед тем как заявлять что он не работает.

Интересно, как быстро тебя опять забанят.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935787
rgreat,

создай Memo1, ProgressBar1 и Button1 на нём событие клик. Вот в общем

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
unit Unit3;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, System.Threading, SyncObjs;

type
  TForm3 = class(TForm)
    ProgressBar1: TProgressBar;
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
begin

  ProgressBar1.Max := 100;

  var CS:=TCriticalSection.Create;
  var ProxyList:=TStringList.Create;
  try
    try
      for var i:=0 to ProgressBar1.Max - 1 do begin
        ProxyList.Add(i.ToString+'.0.0.0:80');
      end;

      TParallel.&For(0, ProxyList.Count-1, procedure (i: integer)
      begin
        var Position := Pos(':', ProxyList.Strings[i]); // НАХОЖУ РАЗДЕЛИТЕЛЬ :
        var IP := Copy(ProxyList.Strings[i], 0, Position - 1); // БЕРУ АЙПИ
        var Port := Copy(ProxyList.Strings[i], Position + 1, ProxyList.Strings[i].Length); // И ПОРТ
        Sleep(Random(500)); // типа тут проверяем прокси
        CS.Enter;
        try
          Memo1.Lines.Add(i.ToString + ' - ' + IP + ':' + Port); // выдаем результат так чтобы потоки друг другу не мешали.
          ProgressBar1.Position :=  i;
          // для консолького ПО - через  TCriticalSection для "формочек" - через Synchronize.
        finally
          CS.Leave;
        end;
      end);
    except
      on E: Exception do
        Memo1.Lines.Add(E.ClassName + ': ' + E.Message);
    end;
  finally
    CS.Free;
    ProxyList.Free;
  end;

  Memo1.Lines.Add('Done.');
end;

end.



Твой поточный код в GUI умер. Потому что он не поточный. Ведь ты не знаешь как TParallel.&For работает.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935789
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Ты совсем слепой?

автор// для консолького ПО - через TCriticalSection для "формочек" - через Synchronize.

Мой пример КОНСОЛЬНЫЙ. Там Synchronize принципиально не работает ибо нет ни GUI ни GUI потока.

Зачем ты его сломал, криво запихав туда работу с GUI?
Блин, и зачем я всяких обормотов учить пытаюсь?
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935790
rgreat,

Какой Synchronize ?
он никогда не будет работать в функции, которая не поточная

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
unit Unit3;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, System.Threading, SyncObjs;

type
  TForm3 = class(TForm)
    ProgressBar1: TProgressBar;
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
begin

  ProgressBar1.Max := 100;

  var ProxyList:=TStringList.Create;
  try
    try
      for var i:=0 to ProgressBar1.Max - 1 do begin
        ProxyList.Add(i.ToString+'.0.0.0:80');
      end;

      TParallel.&For(0, ProxyList.Count-1, procedure (i: integer)
      begin
        var Position := Pos(':', ProxyList.Strings[i]); // НАХОЖУ РАЗДЕЛИТЕЛЬ :
        var IP := Copy(ProxyList.Strings[i], 0, Position - 1); // БЕРУ АЙПИ
        var Port := Copy(ProxyList.Strings[i], Position + 1, ProxyList.Strings[i].Length); // И ПОРТ
        Sleep(Random(500)); // типа тут проверяем прокси
        try
          TThread.Synchronize(nil,
            procedure
            begin
          Memo1.Lines.Add(i.ToString + ' - ' + IP + ':' + Port); // выдаем результат так чтобы потоки друг другу не мешали.
          ProgressBar1.Position :=  i;
          end);
          // для консолького ПО - через  TCriticalSection для "формочек" - через Synchronize.
        finally
        end;
      end);
    except
      on E: Exception do
        Memo1.Lines.Add(E.ClassName + ': ' + E.Message);
    end;
  finally
    ProxyList.Free;
  end;

  Memo1.Lines.Add('Done.');
end;

end.



Тот же самый эффект что и без Synchronize
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935791
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Заканчивай уже свои сломаные костыли вокруг моего кода ставить.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935792
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для тех кто в танке, с GUI.

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
unit Unit14;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Samples.Gauges, Vcl.AppEvnts, Vcl.StdCtrls, System.Generics.Collections,
  Vcl.ExtCtrls;

type
  TForm14 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    Gauge1: TGauge;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    ProxyList: TStringList;
    procedure Sync;
  end;

var
  Form14: TForm14;
  Messages : TQueue<string>;

implementation

uses
  System.Threading, System.SyncObjs;

{$R *.dfm}

procedure TForm14.Button1Click(Sender: TObject);
begin
  ListBox1.Clear;
  Gauge1.Progress:=0;

  TThread.CreateAnonymousThread(procedure begin
    TParallel.&For(0, ProxyList.Count-1, procedure (i: integer)
    begin
      var Position := Pos(':', ProxyList.Strings[i]); // НАХОЖУ РАЗДЕЛИТЕЛЬ :
      var IP := Copy(ProxyList.Strings[i], 0, Position - 1); // БЕРУ АЙПИ
      var Port := Copy(ProxyList.Strings[i], Position + 1, ProxyList.Strings[i].Length); // И ПОРТ
      Sleep(Random(500)); // типа тут проверяем прокси
      Messages.Enqueue(i.ToString + ' - ' + IP + ':' + Port);
      TThread.Synchronize(nil,Form14.Sync);
    end);
    Messages.Enqueue('Done.');
  end).Start;
end;

procedure TForm14.FormCreate(Sender: TObject);
begin
  Gauge1.MaxValue:=100;
  ProxyList:=TStringList.Create;
  for var i:=Gauge1.MinValue to Gauge1.MaxValue do begin
    ProxyList.Add(i.ToString+'.0.0.0:80');
  end;
  Messages:=TQueue<string>.Create;
end;

procedure TForm14.FormDestroy(Sender: TObject);
begin
  ProxyList.Free;
  Messages.Free;
end;

procedure TForm14.Sync;
begin
  ListBox1.Items.Add(Messages.Extract);
  Gauge1.Progress:=Gauge1.Progress+1;
end;

end.



При желании обновлять GUI можно без Synchronize, напромер по таймеру.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935817
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный, rgreat,

Вам не надоело половыми органами меряться? Выложите кто-нибудь ТС'у рабочий код в виде тестового проекта, видите, у него Ctrl+C не работает :)


---------------------
@Tech N9ne,

а на простых примерах из инета потоки не пробовал запускать? Поймешь принцип построения, поймешь и все остальное.

Читал топег по диагонали, но ИМХО, критические секции в твоем случае будут тормозить работу потоков с GUI. Я бы просто отправлял сообщения из доп.потоков в основной либо посредством Queue , либо классическим PostMessage
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935843
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
X-Cite,
Грубо говоря в этом топике, все льют воду, не смотря на счётчик. Не объясняя тс-у как правильно работать с данными в потоке, как ичто передавать. Как и что возвращать.
Изначально он создал ведь тему, из за того что не понимал как массив- стринг передать в поток. И так далее.

Просто у ТС настолько отсутствует понимание предмета, что, по-хорошему, надо объяснять с самых основ. Иначе это попытка задвинуть про Past Perfect Continuous тому, кто даже алфавит не выучил.
Ну или можно дать готовый шаблон, который будет применяться бездумно.
...
Рейтинг: 0 / 0
Потоки.. Несколько вопросов.
    #39935931
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tech N9ne
Люди, спасибо вам за помощь, за примеры...
Вы поймите, я хочу овладеть потоками... А вы мне таски предлагаете. Я впервые слышу о них.. Сейчас конечно почитал о них, что-то понял, что-то нет...
При всём уважении, ребята, вопрос не о том, чем лучше чекать прокси. Да сами прокси это просто пример.
Вопрос о потоках.

Смотри... Поток - это инструмент, с помощью которого асинхронно решают какие-то задачи...
У тебя задача проверить прокси, значит используя поток, ты можешь выполнить проверку асинхронно по отношению к коду, в котором вызываешь проверку.
В этом случае поток должен решать ровно одну задачу, проверка ровно одного прокси. Просто в Delphi изначально сделали какой-то монстроузорный вариант с отдельным классом. Что вводит в заблуждение, когда надо именно выполнить работу асинхронно.
А это значит, что если у тебя список из 100 прокси, то тебе придется для каждой проверки создавать поток, выполнять работу и уничтожать...

Идем дальше.. Вариант с созданием и уничтожением 100 потоков так себе... слишком много ресурсов системы будет затрачено на создание и уничтожение потоков... Поэтому приходит в голову решение, а не создать ли 5-10 потоков, в которых и будет проверка этих 100 прокси... И тут мы приходим к пониманию, что нам надо пул потоков... И сами потоки уже не являются средством решения нашей задачи проверки... Они просто инструмент с помощью которого мы будем решать нашу задачу проверки 100 прокси.. Поэтому появляется новая абстракция - таски... Тебе важно выполнить задачу асинхронно... А уже как она будет сделана - неважно.. с помощью отдельного потока или в том же или еще как, это уже задача другого уровня.

Но если хочется именно велосипеда... Писать свой пул потоков нет ни желания ни понимания... То можно на коленке с имитировать это примерно так...
Тогда твоя задача немного перефразируется...
При этом уже есть куча примитивов которые позволяют это сделать намного удобнее чем использование TStrinList. Например TQueue<T>

Мне надо несколько потоков, которые будут разбирать очередь в которой лежат прокси и проверять их.

Тогда реализация уже перефразированной задачи, с использованием концепции класса потока в Delphi, без примитивов ожидания будет выглядеть так...

Важно, предлагаемый вариант ужасен именно с точки зрения применения современных подходов (когда не нужно знать как работает под капотом, а важнее знать как решать задачи с использованием той или этой технологии), но на коленке понять как работают потоки пойдет...

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Generics.Collections, System.SyncObjs;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    const
      MAXTHREAD = 10;
    var
      FThreads: TObjectList<TThread>; // Список потоков
      FProxyList: TStringList; // Если хочется головной боли, то пусть будет стринглист
      FCounter: Int32; // Счетчик обработки
    procedure Log(const aValue: string);
  public
    { Public declarations }
  end;

  TCallbackLog = reference to procedure(const aValue: string);

  TThreadProxyCheck = class(TThread)
  private
    FList: TStringList;
    FCounter: PInteger;
    FCallback: TCallbackLog;
  protected
    procedure Execute; override;
  public
    constructor Create(const aList: TStringList; const aCounter: PInteger; const aCallback: TCallbackLog);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TThreadProxyCheck }

constructor TThreadProxyCheck.Create(const aList: TStringList; const aCounter: PInteger; const aCallback: TCallbackLog);
begin
  FList := aList;
  FCounter := aCounter; // Передаем указатель, чтобы не использовать глобальные переменные
  FCallback := aCallback; // вывод в лог
  inherited Create(True);
end;

procedure TThreadProxyCheck.Execute;
var
  Index: Int32;
  LValue, RValue: string;
  ID: TThreadID;
begin
  while not Terminated do // Работаем, пока не будет указано о завершении
  begin
    // В идеале должен быть примитив вроде TEvent/TMonitor, чтобы зря не крутился цикл
    if Index >= FList.Count - 1 then // Нужно перед Increment, чтобы не вызывать рост счетчика
    begin
      TInterlocked.Exchange(Index, FCounter^); // Обязательно нужно, чтобы поймать сброшенный счетчик
      Continue;
    end;

    Index := TInterlocked.Increment(FCounter^);

    if Index >= FList.Count - 1 then
      Continue;

    var Value := FList.Strings[Index];
    var Separator := Value.IndexOf(':');
    LValue := Value.Substring(0, Separator);
    RValue := Value.Substring(Separator + 1);

    // Чекаем прокси
    // CheckProxy(LValue, RValue);

    ID := ThreadID;

    TThread.Synchronize( // в данном случае нужен только для того чтобы вывести лог, а так вся работа идет параллельно.
      Self,
      procedure
      begin
        FCallback(ID.ToString() + ': ' + LValue + ' = ' + RValue);
      end
    );
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FCounter := -1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ReportMemoryLeaksOnShutdown := True;

  FProxyList := TStringList.Create();
  FThreads := TObjectList<TThread>.Create();

  // Важно, кол-во элементов в списке будет всегда 100, и сами элементы не будут изменяться пока работают потоки
  // Поэтому доступ к ним не будем синхронизировать
  for var k := 1 to 100 do
    FProxyList.Add(Random(100).ToString() + ':' + (k * k).ToString());

  // По умолчанию работы не будет
  FCounter := FProxyList.Count + 1;

  // будет 10 потоков, которые будут чекать прокси
  for var k := 1 to MAXTHREAD do
    FThreads.Add(TThreadProxyCheck.Create(FProxyList, @FCounter, Log));

  for var k := 0 to MAXTHREAD - 1 do
    FThreads.Items[k].Start();
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FThreads.Free();
  FProxyList.Free();
end;

procedure TForm1.Log(const aValue: string);
begin
  Memo1.Lines.Add(aValue);
end;

end.



Заметь, ни одной глобальной переменной кроме стандартной, и то к ней нет обращения...
...
Рейтинг: 0 / 0
74 сообщений из 74, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Потоки.. Несколько вопросов.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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