Avatar billede rekun Nybegynder
30. juni 2007 - 16:28 Der er 15 kommentarer og
1 løsning

Upload med thread

Jeg har et program hvor jeg gerne vil uploade en fil. Problemet er bare at den "hænger" indtil jeg er færdig med at downloade. Men så har jeg hørt en fugl synge om at man bare skal putte det i en thread.

Jeg har aldrig arbejdet med tråde eller threads før, og da jeg gerne vil have en god start, så spørger jeg jer her på eksperten, om i gider lave en lille step-for-step guide til hvordan man gør.

her er den kode som jeg bruger på min form:

procedure TForm7.Button8Click(Sender: TObject);
var
Files : Tstringlist;
begin
form1.richedit1.Lines.SaveToFile('upload.txt');
idFTP1.Put('upload.txt', (edit2.text + combobox2.Items[combobox2.itemindex]), False);  // Source, Destination filnavn
// Opdater
  Files := TStringList.Create;
  try
    IdFTP1.List(Files,'*.*',false);
  finally
  filelistbox1.Items := files;
  end;
  Files.Free;
end;

Det skal lige siges at jeg tager på ferie i næste uge, så i har god tid til at komme med et svar. Der er masser af point på højkant så derfor håber jeg at i vil lave det så også jeg kan hitte ud af det.
Avatar billede kroning Nybegynder
01. juli 2007 - 18:07 #1
Hvilken Delphi version bruger du. Jeg bruger D7 og ved ikke om det er det samme hvis du f.eks. bruger D2007
Avatar billede rekun Nybegynder
01. juli 2007 - 21:50 #2
bruger D2007...
Avatar billede rekun Nybegynder
01. juli 2007 - 21:51 #3
men mon ikke meget af det er det samme, ellers må jeg hitte resten et andet sted
Avatar billede kroning Nybegynder
02. juli 2007 - 11:50 #4
Det er ikke en step-for-step guide men noget færdig kode, men der er egentlig ikke så meget i det. Jeg har ikke testet men det burde virke.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdFTP, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit2: TEdit;
    ComboBox2: TComboBox;
    RichEdit1: TRichEdit;
    filelistbox1: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure FTPSendOnTerminate(Sender: TObject);
  public
    { Public declarations }
  end;

  TFTPSendThread = class(TThread)
  private
    { Private declarations }
        pFil, pDestNavn : string;
    IdFTP: TIdFTP;
    Files : Tstringlist;

    procedure TilListBox;
  protected
    procedure Execute; override;
  public
    constructor Create(Fil,DestNavn : string);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TFTPSendThread }

constructor TFTPSendThread.Create(Fil, DestNavn : string);
begin
    inherited Create(False);
    FreeOnTerminate:=true;
    pFil:=Fil;
  pDestNavn:=DestNavn;
end;

procedure TFTPSendThread.TilListBox;
begin
    Form1.filelistbox1.Items:=files;
end;

procedure TFTPSendThread.Execute;
begin
    IdFTP:=TIdFTP.Create(nil);
  try
        IdFTP.Host:='www.dinhost.dk';
        IdFTP.Username:='brugernavn';
      IdFTP.Password:='kodeord';

        IdFTP.Connect;
//      IdFTP.ChangeDir('');

        IdFTP.Put(pFil,pDestNavn,false);
    try
            Files:=TStringList.Create;
        IdFTP.List(Files,'*.*',false);
        Synchronize(TilListBox);
    finally
            Files.Free;
    end;
  finally
      IdFTP.Disconnect;
      IdFTP.Free;
    end;
end;

// Thread slut

{ TForm1 }

procedure TForm1.FTPSendOnTerminate(Sender: TObject);
begin
//evt. noget kode når tråden afsluttes
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    form1.richedit1.Lines.SaveToFile('upload.txt');
    TFTPSendThread.Create('upload.txt',edit2.text + combobox2.Items[combobox2.itemindex]).OnTerminate:=FTPSendOnTerminate;
end;

end.
Avatar billede namrednow Nybegynder
03. juli 2007 - 20:38 #5
Findes der nogle grundliggende guides til trådprogrammering?
Avatar billede kroning Nybegynder
03. juli 2007 - 21:14 #6
Avatar billede rekun Nybegynder
08. juli 2007 - 17:23 #7
tak det  ser ud som om det var det jeg kiggede efter... prøver det lidt senere
Avatar billede rekun Nybegynder
09. juli 2007 - 22:03 #8
HJÆLP:::

jeg har prøvet, og prøvet i timevis, men så snart jeg har lavet tråden, ja så fu**er resten af programmet op. det vil sige alle de forms som prøver at hente data fra form1 ( fx form1.savedialog1.filename ) giver denne fejlmeddelelse :
Project <project-name> raised exception class <yyyy> with message <message-text>.
Alle de andre forme kan godt hente data fra hinanden, og form1 kan godt hente data fra andre forme.
Avatar billede kroning Nybegynder
09. juli 2007 - 22:11 #9
At du definere en ny klasse og kalder den TFTPSendThread og lave et par procedurer til den burde ikke være skyld i at du får fejl når andre forme prøver at hente data fra form1, medmindre du får lagt koden til TFTPSendThread ind på en eller anden forkert måde. Men det er jo svært at sige uden at se hele koden.
Du skriver at du får fejl så snart du har "lavet tråden" mener du at fejlen først kommer når du har kaldt "TFTPSendThread.Create()" og den er i gang med at overføre eller hva?
Avatar billede rekun Nybegynder
09. juli 2007 - 22:21 #10
nej, med det mener jeg at fejlen komme lige så snart at jeg tilføjer en tråd til projektet
Avatar billede rekun Nybegynder
09. juli 2007 - 22:29 #11
altså.... Fejlen forsvinder ligesåsnart at jeg fjerner unit8 (tråden) fra projektet. Jeg behøves ikke at create tråden først.

tænkte på... kan det skyldes at jeg bruger denne linie i tråden:  Form1.IdFTP1.Put(pFil,pDestNavn,false);
istedet for at oprette en idFTP i selve tråde?
Avatar billede rekun Nybegynder
09. juli 2007 - 22:45 #12
du sagde det ville hjælpe at se hele koden, så hvis du gider så har jeg et eks her: http://rapidshare.com/files/41987207/tr_d_eks.zip.html
Avatar billede kroning Nybegynder
09. juli 2007 - 22:48 #13
Du må ikke bruge "Form1.IdFTP1.Put(pFil,pDestNavn,false);" IdFTP skal oprettes i tråden.
Avatar billede rekun Nybegynder
09. juli 2007 - 22:57 #14
det løser desværre ikke problemet, så hvis du ville kigge på det eksempel jeg uploadede ville jeg blive utrolig glad :D
Avatar billede rekun Nybegynder
10. juli 2007 - 12:32 #15
nå så løste problemet sig, til andre som har samme problem så skal i bare fjerne den unit som er jeres thread, det gøres ved at vælge projekt->remove from projekt. du kan sagtens bruge tråden selvom den er slettet fra projektet. hvis du skal ændre noget i den, tilføjer du den bare til projektet igen.

til kronning -> smid et svar :P
Avatar billede kroning Nybegynder
10. juli 2007 - 15:08 #16
ok
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