|
Вопрос # 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!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|