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


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