| 
| 
 | Вопрос # 3 746/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты!
 Пол дня сижу над вот такой задачей.
 
 Есть n потоков(будет указывать юзер) и есть m урлов(тоже даёт юзер. хранятся в memo). Допустим надо пройтись по всем урлам и html код сохранить в любой файл(это для примера так как в данной ситуации не важно).
 
 Не знаю как многопоточно сделать это. А точнее не знаю, как организовать работу так, чтобы создалось n потоков и все потоки были заняты, а когда урлы кончались, то освобождались. Читал про метод "карусель", но не могу всё равно представить как это организовать.
 Примечание #1 (7 февраля 2010, 20:39): 
 
|  |   Вопрос задал: zver777 (статус: Посетитель)Вопрос отправлен: 7 февраля 2010, 19:37
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 11; последнее сообщение — 8 февраля 2010, 17:46; участников в обсуждении: 3. 
|   | min@y™ (статус: Доктор наук), 7 февраля 2010, 19:51 [#1]:Будет проще, если ты сделаешь n = m. На каждый урл создавай новый поток, который по окончании закачки сам убъётся. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | zver777 (статус: Посетитель), 7 февраля 2010, 19:54 [#2]:А если урлов будет 1000. Ведь не создавать 1000 потоков. |  
|   | min@y™ (статус: Доктор наук), 7 февраля 2010, 20:01 [#3]: Цитата (zver777): А если урлов будет 1000. Ведь не создавать 1000 потоков.  Да, создавать 1000 потоков - это жестоко. Напиши класс - список потоков, который будет управлять ими и регулировать их количество. Примерчик могу дать.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | zver777 (статус: Посетитель), 7 февраля 2010, 20:04 [#4]:Дай. Заранее спасибо. |  
|   | min@y™ (статус: Доктор наук), 7 февраля 2010, 20:14 [#5]:Да мне не жалко, держи. 
 unit uThreads;
 
interface
 
uses
  Windows, Classes, SysUtils, Controls, Contnrs;
 
type    
  // Класс - очередь потоков, исполняющий их один за другим по порядку
  TThreadQueue = class(TObjectQueue)
  private
    FInProgress: Boolean;
    FCurrentThread: TThread;
    procedure OnThreadTerminate(Sender: TObject);
  public
    constructor Create;
    destructor Destroy; override;
 
    procedure ExecuteThreads;
    procedure TerminateCurrentThread;
    procedure TerminateAllThreads;
 
    property InProgress: Boolean read FInProgress;
    property CurrentThread: TThread read FCurrentThread;
  end;
 
var
  ThreadQueue: TThreadQueue;
 
implementation
 
{ TThreadQueue }
 
constructor TThreadQueue.Create;
begin
  inherited;
  FInProgress:= False;
  FCurrentThread:= nil;
end;
 
destructor TThreadQueue.Destroy;
begin
  if Assigned(FCurrentThread)
    then begin
           FCurrentThread.OnTerminate:= nil;
           FCurrentThread.Terminate();
         end;
 
  while Count <> 0 do
    TThread(Pop()).Free();
 
  inherited;
end;
 
procedure TThreadQueue.ExecuteThreads;
begin
  if (Self.Count <> 0) 
    then begin
           FInProgress:= True;
           FCurrentThread:= TThread(Pop());
           FCurrentThread.OnTerminate:= OnThreadTerminate;
           FCurrentThread.Resume();
         end
    else FInProgress:= False;
end;
 
procedure TThreadQueue.OnThreadTerminate(Sender: TObject);
begin
  FCurrentThread:= nil;
  ExecuteThreads();
end;
 
procedure TThreadQueue.TerminateCurrentThread;
begin
  if Assigned(FCurrentThread)
    then FCurrentThread.Terminate();
end;
 
procedure TThreadQueue.TerminateAllThreads;
var
  T: TThread;
begin
  // очистка очереди
  if Assigned(FCurrentThread)
    then begin
           FCurrentThread.OnTerminate:= nil;
           FCurrentThread.Terminate();
           FCurrentThread:= nil;
         end;
 
  while Self.Count <> 0 do
    begin
      T:= TThread(Self.Pop());
      T.Free();
    end;
 
  FInProgress:= False;
end;
 
initialization
  ThreadQueue:= TThreadQueue.Create();
 
finalization
  ThreadQueue.Free();
 
end.Могу также прислать программу, где эта весчь используется.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | zver777 (статус: Посетитель), 7 февраля 2010, 20:39 [#6]:Как-то сложно всё. Чтобы было легче понять, что я хочу, сделал исходник http://narod.ru/disk/17675813000/zadacha.rar.html
 
 Надо чтобы програма работала в указанное кол. потоков и допустим пробегала по урлам и добавляла в memo2, html код страницы.
 |  
|   | min@y™ (статус: Доктор наук), 7 февраля 2010, 20:48 [#7]: Цитата (zver777): Как-то сложно всё. Ты о чём?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | zver777 (статус: Посетитель), 7 февраля 2010, 21:17 [#8]:Ну код который ты выложил. Неужели эту задачу нельзя решить проще?
 А то я ничего не понял в том коде.
 
 Сделай плиз пример с исходником который я выложил.
 |  
|   | min@y™ (статус: Доктор наук), 7 февраля 2010, 21:28 [#9]: Цитата (zver777): Неужели эту задачу нельзя решить проще? Куда уж проще? Тот код, который я выложил - это пример списка потоков, не более; просто скопипастить его тебе не поможет, он для других целей.
 
 Цитата (zver777): А то я ничего не понял в том коде.  Это твои проблемы.
 Или ты хочешь, чтобы я написал программу за тебя?
 Я ж тебе сказал - пиши класс, регулирующий жизнь и работу потоков. Пронаследуйся от TList или от TObjectList, а ещё лучше - от TThreadList. Добавь туда свойство Max: Cardinal, значение которого будет регулировать количество одновременно живущих потоков.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | min@y™ (статус: Доктор наук), 7 февраля 2010, 21:29 [#10]: Цитата (zver777): Сделай плиз пример с исходником который я выложил.  Чужие исходники я читаю только в том случае, когда это надо МНЕ.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Death_Master (статус: Посетитель), 8 февраля 2010, 17:46 [#11]:Проще посмотреть в сторону ICS http://www.overbyte.be/
 Там все методы основаны на событиях, и можно чтоб после скачивания компонент сразу брал следующий URL.
 Примеров там хватает...
 Обычно захожу по ночам... (60-70%)Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
 P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |