Avatar billede koonz Nybegynder
28. april 2001 - 00:04 Der er 9 kommentarer og
1 løsning

Threds - nogen der gider give et mini kursus - gerne et eksempel

Jeg har kigget lidt på det demo eksempel som findes - men det har ikke givet
de vise sten. - og jeg har aldrig rigtig brugt det før :(

Det korte af det lange er at jeg har en procedure der henter en fil på
internettet - og jeg ville gerne at jeg kunne lave noget andet i programmet
imens - grundprincippet af proceduren ser sådan ud:

procedure TfrmMain.Hentsenestepatch1Click(Sender: TObject);
var
FileOnNet, LocalFileName, path: string;

begin
path := ExtractFilePath(Application.exename);
FileOnNet:=\'Et eller andet sted på nettet\';
path := ExtractFilePath(Application.exename);
LocalFileName:= path + \'Test.txt\';
if fGetInetFile(FileOnNet,LocalFileName)=True then
  Begin
    MessageDlg(\'Program hentet\'
    +#13+#10+\'Du skal genstarte computeren, før programmet er opdateret\',
    mtInformation, [mbOK], 0);
  end
else
  Begin
  ShowMessage(\'Fejl ved hentning af nyeste version\');
  end;
end;

Nogen der gider forklare mig lidt om det ?

Avatar billede nico26 Nybegynder
28. april 2001 - 00:27 #1
du ligger bare koden i trådens execute procedure - se tidligere spm http://www.eksperten.dk/spm/67410
Avatar billede martinlind Nybegynder
28. april 2001 - 00:38 #2
Avatar billede martinlind Nybegynder
28. april 2001 - 00:40 #3
eller gå op på www.undu.com og så efter denne artikel : \"Multithreading - The Delphi Way\"
Avatar billede torbenkoch Nybegynder
28. april 2001 - 23:54 #4
Martinlinds link er rigtigt godt - jeg mente selv, at jeg var ret ferm til multithreading, men fik da nogle gode tips fra artiklen alligevel.
Avatar billede koonz Nybegynder
01. maj 2001 - 19:37 #5
Jeg kan ikke rigtig få det til at funke, kan det være fordi jeg kalder en funktion inde i min Thead - er det ikke tilladt ?
Avatar billede koonz Nybegynder
01. maj 2001 - 19:49 #6
Næh - for nu lagde jeg funktionen derind, det hjalp ikke.......

Her er lidt af koden

type
  TUpdateFileThead = class(TThread)
  private
  protected
    procedure Execute; override;
  end;



procedure TUpdateFileThead.Execute;
var
  hSession, hURL: HInternet;
  Buffer: array[1..BufferSize] of Byte;
  BufferLen: DWORD;
  f: File;
  sAppName, FileURL, FileName: 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;

procedure TfrmMain.Hentsenestepatch1Click(Sender: TObject);
var
T: TUpdateFileThead;
begin
T.Create(True);
T.Resume;
end;

Det giver fejl ved Resume, og fungerer slet ikke hvis jeg fjerner det.
Avatar billede torbenkoch Nybegynder
01. maj 2001 - 20:01 #7
Det giver en fejl - hvilken fejl?
Avatar billede koonz Nybegynder
02. maj 2001 - 20:07 #8
AccessViolation - og uden T.Resume, kører det slet ikke
Avatar billede torbenkoch Nybegynder
03. maj 2001 - 07:55 #9
Prøv at skrive:

  T := TUpdateFileThread.Create(True)

i stedet for T.Create(True)
Avatar billede martinlind Nybegynder
03. maj 2001 - 10:22 #10
Det er IKKE noget du skal prøve det er noget du SKAL, du skal create en instance af dit tråd object og lægge den i en var, ellers for du en accessviolation. Der findes dog en måde at undgå denne var, men kun hvis man ikke har brug for at refere til den igen.

VAR
  obj : TObject;


begin
  obj := TObject.Create;
// eller
  with TObject.Create do
  begin
      // her kan man bruge det object man lige har erklæret, men kun mellem begin..end, bemærk at det er Typen man creater
  end;
end;

/Martin
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester