Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 31.01.2012, 23:20
syserg syserg вне форума
Прохожий
 
Регистрация: 26.01.2009
Сообщения: 15
Репутация: 10
По умолчанию Многопоточность с ограниченным количеством потоков

Уважаемые программисты, направьте на путь.
Есть список URL в TStringList. Я забираю данные с этих страниц к себе в базу.
Многопоточность создать удалось, но куча косяков.
Среди них не могу по-челевечески решить следующий вопрос:

Я хочу устанавливать количество одновременно работающих потоков, например 8, а записей пусть 100.
Как мне это верно организовать?

Т.е. мне нужно отслеживать количество работающих потоков, как только какие-то освободились, подгружать новые?

Код:
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
unit unit1;
  
procedure TF_Irr.GetCache(SL:TStringList; threads:integer);
var i,j,thrds,len:integer;
a: array of TMyThread1;
begin
alive:=0; //живые потоки
i:=0;
thrds:=threads; //количество мной установленных потоков
len:=SL.Count;
  
//А ДАЛЬШЕ - МОЯ ФАНТАЗИЯ, КОТОРАЯ, Я УВЕРЕН, ДОЛЖНА ПРОЩЕ РЕШАТЬСЯ
  
SetLength(a,len);
repeat
if i<=len-1 then begin
  
if (len-i)<thrds  then begin thrds:=len-i; alive:=0; end;
if alive<thrds then begin
for j:=i to (thrds-alive-1+i) do begin
a[j]:=TMyThread1.Create(true,SL[i]);
a[j].Resume; //запускаем процедуру загрузки данных
inc(i);
  
end;
end else a[i-1].WaitFor;
end;
  
until i>len-1;
  
  
end;
  
  
///////////////////////////////////////
unit thread;
  
constructor TMyThread1.Create(CreateSuspended: boolean; AURL: string);
begin
inherited Create(CreateSuspended);
FURL:=AURL;
  
InterlockedIncrement(alive);
Priority:=tpHigher;
//FreeOnTerminate:=true;
OnTerminate:=ThreadExit;
//Resume;
end;
  
  
procedure TMyThread1.ThreadExit(Sender: TObject);
begin
InterlockedDecrement(alive);
synchronize(ShowAlive);
end;
  
procedure TMyThread1.Execute;
var
s,ch: string;
i: integer;
inStream: TMemoryStream;
E: Exception;
idHTTP: TIdHTTP;
idCompress:TIdCompressorZLib;
begin
//код процедуры
synchronize(ShowResult);
Terminate;
end;
  
procedure TMyThread1.ShowResult;
begin
//куда-нить записываю данные, пусть в memo
end;

На одном из форумов получил ответ:
Цитата:
Незачем постоянно создавать-уничтожать потоки, можно просто организовать синхронизированное извлечение следующего URL из списка. Тогда потоков создашь столько, сколько нужно, в начале цикла, а по получении всех адресов они тихо завершатся

Подскажите наиболее верное решение. Я только начал знакомиться с потоками.

Заранее огромное спасибо
Ответить с цитированием
 


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:26.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025