[delphi7] thread / idFTP

Pagina: 1
Acties:
  • 115 views sinds 30-01-2008
  • Reageer

  • Rambo
  • Registratie: Maart 2001
  • Laatst online: 19-12-2024
Delphi7
idFTP component
---------

Ik kom er echt niet meer uit. Al verschillende dingen opgezocht over threads, al veel uitgeprobeerd maar het werkt gewoon niet :/

Ik weet dat de code onder Execute (van thread) wordt uitgevoert, getest met een showmessage. Maar toch wordt mijn file niet ge-upload en ik weet niet waarom.

Klopt het dat je geen error messages krijgt van fouten binnen een thread?
Hoe krijg ik trouwens mijn debug scherm terug onder de code ? :)

Wie weet wat ik hier fout doe?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdFTP, thread;

type
  TForm1 = class(TForm)
    //IdFTP1: TIdFTP; hoort hier toch niet?
    UploadButton: TButton;
    Label1: TLabel;
    procedure UploadButtonClick(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  UploadFile = class(TThread)
  //hier wel toch? Moet toch alleen binnen
  //de thread?
  IdFTP1: TIdFTP;
   private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure Bericht;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.UploadButtonClick(Sender: TObject);
Var
  MyThread: UploadFile;

begin
 MyThread := UploadFile.Create( True );

  With MyThread do
    Begin
      FreeOnTerminate := True;
      Resume;
    end;

end;



// berichtje om te controleren of Execute wordt uitgevoert
procedure UploadFile.Bericht;
begin
 ShowMessage('thread started');
end;




procedure UploadFile.Execute;
begin

//Bericht wordt getoond
 Synchronize(Bericht);

 // onderstaande code schijnt niks te doen

 // inloggen
 IdFTP1.Host := '***';
 IdFTP1.Name := '***';
 IdFTP1.Password := '***';

 idFTP1.Connect();

 // effe changen naar mijn test dir.
 IdFTP1.ChangeDir('apptest');

 // en de file uploaden
 randomize;
 idFTP1.Put('c:\testfile.bin','test'+inttostr(random(1000)));
 idFTP1.Quit;

end;

end.


heb het effe online gezet:
Download

[ Voor 9% gewijzigd door Rambo op 16-02-2004 02:29 ]


  • martijn_brinkers
  • Registratie: November 2001
  • Laatst online: 31-10-2025
je maakt nergens een instantie van TIdFTP aan. Doe bijv: (niet getest)

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure UploadFile.Execute;
begin

//Bericht wordt getoond
 Synchronize(Bericht);

  // !!! creeer een instantie van FTP object
  idFTP1 := TIdFTP.Create( Nil );

 // inloggen
 IdFTP1.Host := '***';


  // !!!! verwijder instantie 

  idFTP1.Free;

  • Rambo
  • Registratie: Maart 2001
  • Laatst online: 19-12-2024
Gedaan.
Nog steeds geen foutmelding ofzo, en op mn server blijkt de file weer niet te zijn ge-upload.

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Geef eens iets meer (debug) info. Als je bij mogelijke oplossingen alleen maar blijft roepen dat het niet doet wat je zou willen, kunnen wij je natuurlijk niet helpen. Voor hetzelfde geld zijn je inlog gegevens niet goed... :X

Edit:
Voor je messages: rechtermuisknop op je code editor en kies dan "Message view"...

[ Voor 20% gewijzigd door OZ-Gump op 16-02-2004 09:42 ]

My personal website


  • Rambo
  • Registratie: Maart 2001
  • Laatst online: 19-12-2024
Daar ligt het niet aan, ik krijg mijn debugscherm ook niet meer terug :? :)
JE weet wel dat schermpje onder je code met alle hints/warnings/errors.

  • Rambo
  • Registratie: Maart 2001
  • Laatst online: 19-12-2024
dat schermpje heb ik inmiddels weer gevonden. Heb effe tussen de regels een Beep; geplaatst om uit te vinden waar het programma in de code niet verder komt.

idFTP1.Connect();
Dat gaat niet goed.
Maar ik krijg geen debuginfo of een error :/

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Kennelijk wordt er een exceptie gegooid die je niet ziet. Ik heb dan ook, zoals het ook eigenlijk hoort, een groot try...except block om de code in je Execute unit gezet. En toen kwam het probleem aan het licht. De exceptie luide "***" is not a valid component name. Name is namelijk de property voor de naam van het component, niet de inlognaam :D. Gebruik IdFTP.UserName daarvoor.

We adore chaos because we like to restore order - M.C. Escher


  • Rambo
  • Registratie: Maart 2001
  • Laatst online: 19-12-2024
Oh wat stom :/
BEDANKT! Trouwens, ken ik jou ergens van? ;)

Ben blij met mijn eerste thread :)

  • Rambo
  • Registratie: Maart 2001
  • Laatst online: 19-12-2024
Ander probleempje:
Mijn progress bar werkt niet.
procedure UploadFile.IdFTP1WorkBegin/WorkEnd/Work
worden niet uitgevoert.

Wanneer ik idFTP op mijn Form gebruikte gebeurde dat wel. Heb nu gewoon van Form1.idFTP1WorkBegegin, etc
UploadFile.idFTP1WorkBegegin, etc. van gemaakt. en de procedures ook bij de type van UploadFile (thread) geplaatst.

stukje code:


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
type
  UploadFile = class(TThread)
  IdFTP1: TIdFTP;
  STime: TDateTime;

   private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
    const AWorkCountMax: Integer);
    procedure IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
    const AWorkCount: Integer);
    procedure IdFTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
  end;


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
procedure UploadFile.IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
  STime := Now;
  Form1.ProgressBar1.Max := AWorkCountMax;
  Form1.ProgressBar1.Position := 0;
end;

procedure UploadFile.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);

var
  S: String;
  TotalTime: TDateTime;
  H, M, Sec, MS: Word;
  DLTime: Double;

begin
  TotalTime :=  Now - STime;
  DecodeTime(TotalTime, H, M, Sec, MS);
  Sec := Sec + M * 60 + H * 3600;
  DLTime := Sec + MS / 1000;

  if DLTime > 0 then
  AverageSpeed := {(AverageSpeed + }(AWorkCount / 1024) / DLTime{) / 2};

  S := FormatFloat('0 kB/s', AverageSpeed);
  Form1.StatusBar1.Panels[1].Text := S;
  Form1.ProgressBar1.Position := AWorkCount;
end;

procedure UploadFile.IdFTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
 Form1.StatusBar1.Panels[1].Text := '';
 Form1.ProgressBar1.Position := 0;
end;



Dit werkte voorheen wel toen ik het gewoon vanuit de Form aanroepte. Maar nu in die thread dus niet.

Verwijderd

Heb je wel de event er aan gekoppeld?

In je constructor moet je dus zoiets hebben staan:

Delphi:
1
2
  IdFTP1.OnWorkBegin := IdFTP1WorkBegin;
  ............

  • Rambo
  • Registratie: Maart 2001
  • Laatst online: 19-12-2024
Heeft niet gewerkt :/

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 23:27

Creepy

Tactical Espionage Splatterer

Das pech voor je...

.... ok.. ff serieus. Laat de code eens zien hoe je de onWorkBegin procedures e.d. hebt gekoppeld aan je object. Heb je al door je code heen gestapt? Worden de procedures aangeroepen? Heb je al met debug units gecompileerd zodat je ook door de OnworkBegin e.d. van het idFTP component kan gaan?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 23:53

Reptile209

- gers -

Ehm, zou je die verwijzingen naar Form1.ProgessBar1 niet ook netjes in een synchronize gooien? Nu zal het denk ik zo zijn dat er intern wat messages scheef gaan lopen, waardoor je bar niet wordt bijgewerkt.

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
type
  MyThread=class(TThread)
  ...
  BarPos, BarMax: integer;
  ..
  procedure Work;
  procedure UpdateBar;
end;

...

procedure MyThread.Work
begin
  // constateer hier dat er "work" is van IdFTP en update je bar
  BarPos := AWorkCount;
  synchronize(BarUpdate);
end;

procedure TMyThread.BarUpdate;
begin
  Form1.ProgressBar1.Position := BarPos;
end;

Zoiets. :)

Zo scherp als een voetbal!

Pagina: 1