Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 746

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!

Пол дня сижу над вот такой задачей.

Есть n потоков(будет указывать юзер) и есть m урлов(тоже даёт юзер. хранятся в memo). Допустим надо пройтись по всем урлам и html код сохранить в любой файл(это для примера так как в данной ситуации не важно).

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

Примечание #1 (7 февраля 2010, 20:39):
Чтобы было легче понять, что я хочу, сделал исходник http://narod.ru/disk/17675813000/zadacha.rar.html

Надо чтобы програма работала в указанное кол. потоков и допустим пробегала по урлам и добавляла в memo2, html код страницы.

zver777 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: zver777 (статус: Посетитель)
Вопрос отправлен: 7 февраля 2010, 19:37
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 11; последнее сообщение — 8 февраля 2010, 17:46; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 7 февраля 2010, 19:51 [#1]:

Будет проще, если ты сделаешь n = m. На каждый урл создавай новый поток, который по окончании закачки сам убъётся.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
zver777

zver777 (статус: Посетитель), 7 февраля 2010, 19:54 [#2]:

А если урлов будет 1000. Ведь не создавать 1000 потоков.
min@y™

min@y™ (статус: Доктор наук), 7 февраля 2010, 20:01 [#3]:

Цитата (zver777):

А если урлов будет 1000. Ведь не создавать 1000 потоков.

Да, создавать 1000 потоков - это жестоко. Напиши класс - список потоков, который будет управлять ими и регулировать их количество. Примерчик могу дать.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
zver777

zver777 (статус: Посетитель), 7 февраля 2010, 20:04 [#4]:

Дай. Заранее спасибо.
min@y™

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

zver777 (статус: Посетитель), 7 февраля 2010, 20:39 [#6]:

Как-то сложно всё.
Чтобы было легче понять, что я хочу, сделал исходник http://narod.ru/disk/17675813000/zadacha.rar.html

Надо чтобы програма работала в указанное кол. потоков и допустим пробегала по урлам и добавляла в memo2, html код страницы.
min@y™

min@y™ (статус: Доктор наук), 7 февраля 2010, 20:48 [#7]:

Цитата (zver777):

Как-то сложно всё.

Ты о чём?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
zver777

zver777 (статус: Посетитель), 7 февраля 2010, 21:17 [#8]:

Ну код который ты выложил.
Неужели эту задачу нельзя решить проще?
А то я ничего не понял в том коде.

Сделай плиз пример с исходником который я выложил.
min@y™

min@y™ (статус: Доктор наук), 7 февраля 2010, 21:28 [#9]:

Цитата (zver777):

Неужели эту задачу нельзя решить проще?

Куда уж проще? Тот код, который я выложил - это пример списка потоков, не более; просто скопипастить его тебе не поможет, он для других целей.

Цитата (zver777):

А то я ничего не понял в том коде.

Это твои проблемы.
Или ты хочешь, чтобы я написал программу за тебя?
Я ж тебе сказал - пиши класс, регулирующий жизнь и работу потоков. Пронаследуйся от TList или от TObjectList, а ещё лучше - от TThreadList. Добавь туда свойство Max: Cardinal, значение которого будет регулировать количество одновременно живущих потоков.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 7 февраля 2010, 21:29 [#10]:

Цитата (zver777):

Сделай плиз пример с исходником который я выложил.

Чужие исходники я читаю только в том случае, когда это надо МНЕ.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Death_Master

Death_Master (статус: Посетитель), 8 февраля 2010, 17:46 [#11]:

Проще посмотреть в сторону ICS
http://www.overbyte.be/
Там все методы основаны на событиях, и можно чтоб после скачивания компонент сразу брал следующий URL.
Примеров там хватает...
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:41
Выполнено за 0.03 сек.