/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
TThread - igen
Fra : Ulrik Vadstrup


Dato : 18-07-01 20:02

Jeg har en TThread, der downloader en fil fra nettet.

Nu vil jeg gerne have den til at køre en progressbar fra 0 -100 mens den
downloader, sætte en boolean værdi true når den er færdig (Bruges hvis
program afsluttes før download er færdig), samt komme med en popup, når den
er færdig.

Jeg har ikke arbejdet så meget med TThread, og jeg kan ikke rigtig lure
hvordan jeg "kommunikerer" værdierne til min form/progressbar, for det går
åbenbart ikke at sætte den inde fra min TThread.

Nogen der har et foreslag.


TThread ser ud som følgende

type
TGetPatch = class(TThread)
Private
Protected
procedure Execute; override;
public
end;


Procedure TGetPatch.Execute;
var
hSession, hURL: HInternet;
Buffer: array[1..BufferSize] of Byte;
BufferLen: DWORD;
f: File;
sAppName, Filename, fileURL: String;
begin

Filename := ExtractFilePath(Application.Exename) + 'FangstDB.new';
fileURL := 'http://www.blackend.dk/FangstDB.exe';
sAppName := ExtractFileName(Application.ExeName);
hSession := InternetOpen(PChar(sAppName),
INTERNET_OPEN_TYPE_PRECONFIG,
nil, nil, 0);
try
hURL := InternetOpenURL(hSession,
PChar(fileURL),
nil,0,0,0);
try
AssignFile(f, FileName);
Rewrite(f,1);
repeat
InternetReadFile(hURL, @Buffer,
SizeOf(Buffer), BufferLen);
BlockWrite(f, Buffer, BufferLen)
until BufferLen = 0;
CloseFile(f);
finally
InternetCloseHandle(hURL)
end;
finally
InternetCloseHandle(hSession)
end;
end;


--
Med venlig hilsen
Ulrik Vadstrup



 
 
Claus Christiansen (20-07-2001)
Kommentar
Fra : Claus Christiansen


Dato : 20-07-01 23:24

"Ulrik Vadstrup" <vadstrup@post12.tele.dk> wrote in
news:9j4mc4$nkl$1@news.cybercity.dk:

> Jeg har en TThread, der downloader en fil fra nettet.
>
> Nu vil jeg gerne have den til at køre en progressbar fra 0 -100 mens
> den downloader, sætte en boolean værdi true når den er færdig (Bruges
> hvis program afsluttes før download er færdig), samt komme med en
> popup, når den er færdig.
>
> Jeg har ikke arbejdet så meget med TThread, og jeg kan ikke rigtig
> lure hvordan jeg "kommunikerer" værdierne til min form/progressbar,
> for det går åbenbart ikke at sætte den inde fra min TThread.
>
> Nogen der har et foreslag.

Har rettet og tilføjet lidt i koden, se neden for.

>
> TThread ser ud som følgende
>
> type
* TProgressUpdate = procedure (Sender: TObject; progress: integer); *

> TGetPatch = class(TThread)
> Private
* FProgressUpdate: TProgressUpdate; *
* Progress: integer; *
* procedure UpdateForm; *
> Protected
> procedure Execute; override;
> public
* property OnProgressUpdate: TProgressUpdate read FProgressUpdate
write FProgressUpdate;
> end;
>
>
> Procedure TGetPatch.Execute;
> var
> hSession, hURL: HInternet;
> Buffer: array[1..BufferSize] of Byte;
> BufferLen: DWORD;
> f: File;
> sAppName, Filename, fileURL: String;
> begin
>
> Filename := ExtractFilePath(Application.Exename) + 'FangstDB.new';
> fileURL := 'http://www.blackend.dk/FangstDB.exe';
> sAppName := ExtractFileName(Application.ExeName);
> hSession := InternetOpen(PChar(sAppName),
> INTERNET_OPEN_TYPE_PRECONFIG,
> nil, nil, 0);
> try
> hURL := InternetOpenURL(hSession,
> PChar(fileURL),
> nil,0,0,0);
> try
> AssignFile(f, FileName);
> Rewrite(f,1);
> repeat
> InternetReadFile(hURL, @Buffer,
> SizeOf(Buffer), BufferLen);
> BlockWrite(f, Buffer, BufferLen)
* Progress := /hvordan det nu skal beregnes/*
* Synchronize(UpdateForm); *
> until BufferLen = 0;
> CloseFile(f);
> finally
> InternetCloseHandle(hURL)
> end;
> finally
> InternetCloseHandle(hSession)
> end;
> end;

procedure TGetPatch.UpdateForm;
begin
if assigned(FProgressUpdate) then FProgressUpdate(self, progress);
end;

og i din form:

....
private
procedure UpdateProgress(Sender: TObject; Progress: Integer);
....

procedure TFormMain.UpdateProgress(Sender: TObject; Progress: Integer);
begin
FormMain.Progressbar.Position := Progress;
end;

....og ved oprettelse af thread:

Thread := Thread.Create(true);
Thread.OnProgressUpdate := UpdateProgress;
Thread.resume;

- det kan laves kortere, men jeg tror ikke lige det kan laves meget
pænere

/Claus
--
Claus Christiansen, <mailto:cch@unipeople.dk>

personal: http://www.bigfoot.com/~kruc/; pythia: http://www.pythia.dk
============================================--------------------------
"Computers are useless. They can only give you answers."
- Pablo Picasso (1881-1973)

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408526
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste