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

Delphi Sources



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

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

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

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

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

Код:
    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, время: 10:57.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter