![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перекачка [D5, Win95/98]
Vampire © (2003-02-11 18:51:00)Доброго времени суток.
Стоит следующая задача...
организовать копирование файлов по сети...
Можно конечно стандартными методами через Сокеты,
но система жрет много ресурсов, все тормозит и в конечно итоге файл свыше 4ех метров переписать удается примерно как 50 на 50%...
Есть ли способ более выгодного копирования файлов?
Например разбить файл на куски и какчать его потоки как-то слитно... Например как устроен ГэтРайт...
Буду благодарен любым советам и ссылкам...
Vampire (2003-02-16 05:48:00) [1]Блин...нсть такой исходник...
Клиент:
unit client;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Bevel1: TBevel;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
reciving: boolean;
datasize: integer;
data: tmemorystream;
public
{ Public declarations }
end;
var
Form1: TForm1;
dat: tmemorystream;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
clientsocket1.Active:=true;
end;
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
socket.SendText("send");
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var s,sl: string;
begin
s:=socket.ReceiveText;
if not Reciving then
begin
SetLength(sl,strlen(pchar(s))+1);
strlcopy(@sl[1],pchar(s), length(sl)-1);
datasize:=strToint(sl);
data:=TMemoryStream.create;
delete(s,1,length(sl));
reciving:=true;
end;
try
data.write(s[1],length(s));
if data.size =datasize then
begin
dat:=tmemorystream.Create;
data.position:=0;
dat.LoadFromStream(data);
dat.SaveToFile("c:\999.mp3");
data.free;
reciving:=false;
socket.Close;
end;
except
data.free;
end;
end;
end.
Сервер:
unit client;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Bevel1: TBevel;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
reciving: boolean;
datasize: integer;
data: tmemorystream;
public
{ Public declarations }
end;
var
Form1: TForm1;
dat: tmemorystream;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
clientsocket1.Active:=true;
end;
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
socket.SendText("send");
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var s,sl: string;
begin
s:=socket.ReceiveText;
if not Reciving then
begin
SetLength(sl,strlen(pchar(s))+1);
strlcopy(@sl[1],pchar(s), length(sl)-1);
datasize:=strToint(sl);
data:=TMemoryStream.create;
delete(s,1,length(sl));
reciving:=true;
end;
try
data.write(s[1],length(s));
if data.size =datasize then
begin
dat:=tmemorystream.Create;
data.position:=0;
dat.LoadFromStream(data);
dat.SaveToFile("c:\999.mp3");
data.free;
reciving:=false;
socket.Close;
end;
except
data.free;
end;
end;
end.
------------------------------------
Подскажите что можно сделать, чтобы приложение не подвисало,
а типа как говорят пускать все в своем потоке...но это каждый знает...
может кто покажет именно текстом что и как можно изменить чтобы работало...и объяснялось наглядно...
imbicil (2003-02-14 07:20:00) [2]почитай http://www.pergolesi.demon.co.uk/prog/threads/ToC.html
Извини на русском пока нет, но я скоро закончу перевод этой книги.
Vampire (2003-02-14 05:29:00) [3]>> в конечно итоге файл свыше 4ех метров переписать удается примерно как 50 на 50%...
Как это понимать? Не "докачивает" что-ли?
т.е. вероятность перекачки файла полностью... до зависания компа...
Если ли где пример с объяснением на тему с отдельным потоком?
mrcat (2003-02-12 14:51:00) [4]Определитесь, что конкретно надо - докачивать "Например как устроен ГэтРайт...", или что?!
>> но система жрет много ресурсов, все тормозит
Чтобы не тормозило - закачивайте в отдельном "потоке"
>> в конечно итоге файл свыше 4ех метров переписать удается примерно как 50 на 50%...
Как это понимать? Не "докачивает" что-ли?