информационная безопасность
без паники и всерьез
 подробно о проекте
Атака на InternetSpanning Tree Protocol: недокументированное применениеВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Модульный ботнет от русских хакеров 
 Торвальдс и вайбтестеры 
 Атака на GitHub 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Pascal] Два файла не хотят одновременно скачиваться!!! 14.09.01 01:54  
Автор: KL Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Надо одновременно скачивать из инета несколько разных файлов. Я написал маленькую тестовую програмку для отладки это фичи, думая что никаких особых проблем не будет :((. Прога одновременно запускает несколько подзадач (ну Thread-ов то есть) в которых и идет скачивание файлов. Но постоянно получается один глобальный глюк: пока одна подзадача скачивает один файл, все остальные подзадачи тупо простаивают, т.е. ничего не скачивают! Когда один из файлов скачался, то активизируется следующая подзадача скачивающая следующий файл. Т.е. идет обыкновенное поочередное скачивание файлов, тогда как нужно - параллельное. Все подзадачи стартуют одновременно и через прогу-вьювер запущеных процессов точно видно что подзадачи работают одновременно, а не запускаються поочереди. Я пробовал с HTTP компонентой и из Indy и с NmHttp - результат одинаковый!!! МОжет я что-то не так делаю в работе с подзадачами?

Кто может, помогите разобраться в чем тут дело. Вот весь код:

=======
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, HttpThread, IdBaseComponent, Buttons, IdAntiFreezeBase,
IdAntiFreeze;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
SpeedButton1: TSpeedButton;
IdAntiFreeze1: TIdAntiFreeze;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
th1, th2, th3: THttpThread;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
// starting 2 threads
th1 :=THttpThread.Create(True);
th1.FFileName := 'D:\test_file.zip';
th1.FUrl := Edit1.Text;
th1.FOwner := Form1;
th1.ReportLabel := Label1;
th1.Resume;

th2 :=THttpThread.Create(True);
th2.FFileName := 'D:\test_file1.zip';
th2.FUrl := Edit2.Text;
th2.FOwner := Form1;
th2.ReportLabel := Label2;
th2.Resume;
end;

end.
========
unit HttpThread;

interface

uses
Classes, SysUtils, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdHTTP, Forms, StdCtrls, NmHttp;

type
THttpThread = class(TThread)
private
{ Private declarations }
// FHttp: TidHttp;
FHttp: TNmHttp;
procedure Download;
procedure FOnWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
procedure FOnNMWork(Sender: TObject);
protected
procedure Execute; override;
public
FFileName, FUrl: String;
FOwner: TComponent;
ReportLabel: TLabel;
end;

implementation

uses Unit1;

{ Important: Methods and properties of objects in VCL can only be used in a
method called using Synchronize, for example,

Synchronize(UpdateCaption);

and UpdateCaption could look like,

procedure THttpThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }

{ THttpThread }

procedure THttpThread.Download;
var
stream: TFileStream;
file_create: file;
begin
{
if not FileExists(FFileName) then begin
AssignFile(file_create, FFileName);
Rewrite(file_create);
CloseFile(file_create);
end;
stream:=TFileStream.Create(FFileName, fmOpenReadWrite);
FHttp:=TIdHTTP.Create(FOwner);
FHttp.OnWork := FOnWork;
FHttp.Request.UserAgent := 'http/ftp test';
FHttp.Request.Username := '';
FHttp.Request.Password := '';
FHttp.Request.ProxyServer := '';
FHttp.Request.ProxyPort := 80;
FHttp.Request.ContentType := '';
try
Form1.Memo1.Lines.Add('Http thread ' + IntToStr(ThreadId) + ' started: ' + TimeToStr(Time));
Application.ProcessMessages;
FHttp.Get(FUrl, stream);
except
Form1.Memo1.Lines.Add('Http thread ' + IntToStr(ThreadId) + ' exception');
end;
FHttp.Disconnect;
stream.Free;
FHttp.Free;
Form1.Memo1.Lines.Add('Http thread ' + IntToStr(ThreadId) + ' DONE: ' + TimeToStr(Time));
}
FHttp := TNmHttp.Create(nil);
FHttp.InputFileMode := True;
FHttp.Header := FFileName + '_header';
FHttp.Body := FFileName;
FHttp.OnPacketRecvd := FOnNMWork;
try
Form1.Memo1.Lines.Add('Http thread ' + IntToStr(ThreadId) + ' started: ' + TimeToStr(Time));
FHttp.Get(FUrl);
except
Form1.Memo1.Lines.Add('Http thread ' + IntToStr(ThreadId) + ' exception');
end;
FHttp.Free;
Form1.Memo1.Lines.Add('Http thread ' + IntToStr(ThreadId) + ' DONE: ' + TimeToStr(Time));
end;

procedure THttpThread.Execute;
begin
{ Place thread code here }
Synchronize(Download);
end;

procedure THttpThread.FOnNMWork(Sender: TObject);
begin
ReportLabel.Caption := IntToStr(FHttp.BytesRecvd);
end;

procedure THttpThread.FOnWork(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
ReportLabel.Caption := IntToStr(AWorkCount);
end;

end.
========
1





Рейтинг@Mail.ru


  Copyright © 2001-2026 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach