Autor Beitrag
LuMa86
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76



BeitragVerfasst: So 11.08.13 18:42 
Hallo,
ich habe mich jetzt mal durch das Thema Threads gearbeitet. Allerdings hänge ich an einer Stelle (Meine Quelle: wiki.delphigl.com/in...rial_Multithreading). Mein Programm hasht Dateien. Der Thread läuft nach Programmstart einmal durch und dann ist Schluss. Nach jeder gehashten Datei soll er die Statusleiste der MainForm updaten. Bisher habe ich das so gemacht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TFileHandler.SyncProgress; //KEIN SYNCHRONISIERTES EVENT! NUR DER PROCEDURE NAME!
begin
  frmMain.PbProgress.Min := 0;
  frmMain.PbProgress.Max := FMaxFiles;
  frmMain.PbProgress.Position := FDoneFiles;
end;


Das hat auch super funktioniert, da die MainForm mit der Statusleiste nichts am Hut hat und somit auch kein gleichzeitiger Zugriff erfolgen kann.

Allerdings wollte ich keine halben Sachen machen, also habe ich das so gemacht wie im Tutorial:
ausblenden Delphi-Quelltext
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:
type
  TProgress = procedure(const AMin, AValue, AMax: Integer)
    of object;

TFileHandler = class(TThread)
  private
     FProgress: TProgress;
     procedure SyncProgress;
     // ...
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
     property Progress: TProgress read FProgress write FProgress;
     // ...
  protected
    procedure Execute; override;
  end;

// Nach dem durchlaufen einer Runde in einer Schleife (eine Datei gehasht) kommt der Aufruf zum aktualisieren:
Synchronize(SyncProgress);

procedure TFileHandler.SyncProgress;
begin
  if Assigned(FProgress) then
    FProgress(0, FDoneFiles, FMaxFiles, FDoneFileSize, FMaxFileSize);
end;


Und jetzt? Ich muss gestehen das ich nciht weiß, wie es jetzt weiter geht. Ich muss ja jetzt noch die ProgressBar aktualisieren. Aber wo mach ich das? Und wie greife ich jetzt auf die übergebenen Werte zu?

Grüße,
LuMa


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Di 13.08.2013 um 10:26
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: So 11.08.13 19:45 
user profile iconLuMa86 hat folgendes geschrieben Zum zitierten Posting springen:
Und jetzt? Ich muss gestehen das ich nciht weiß, wie es jetzt weiter geht. Ich muss ja jetzt noch die ProgressBar aktualisieren. Aber wo mach ich das? Und wie greife ich jetzt auf die übergebenen Werte zu?


Du musst eigentlich nur noch einen Eventhandler für Progress schreiben.
Also im Formular eine Procedure nach dem Schema von TProgress anlegen:
ausblenden Delphi-Quelltext
1:
procedure MeinThread_OnProgress(const AMin, AValue, AMax: Integer)					


Wenn Du nun die Instanz vom Thread erzeugst, dann verbindet Du noch den Eventhandler, bevor Du ihn startetst.
Irgendwo hast Du ja noch sowas wie
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var 
  meinThread : TFileHandler;

begin
  meinThread := TFileHandler.Create;
  meinThread.Progress := MeinThread_OnProgress;
[...]

end;


Dann wird MeinThread_OnProgress vom Thread aus Synchronisiert aufgerufen. Damit ist es schon fertig.

Nebenbemerkung: Ich persönlich benenne die Event-Properties immer mit "On". Also bei mir hieße es
ausblenden Delphi-Quelltext
1:
property OnProgress: TProgress read FProgress write FProgress;					

Dann weiß man gleich, dass das ein Event ist.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)

Für diesen Beitrag haben gedankt: LuMa86
LuMa86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76



BeitragVerfasst: So 11.08.13 19:58 
Ah, und der Zugriff auf die Progressbar, findet dann in dem Costum Event statt?

ausblenden volle Höhe Delphi-Quelltext
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:
type
  TProgress = procedure(const AMin, AValue, AMax: Integer)
    of object;

TFileHandler = class(TThread)
  private
     FProgress: TProgress;
     procedure SyncProgress;
     // ...
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
     property Progress: TProgress read FProgress write FProgress;
     // ...
  protected
    procedure Execute; override;
  end;

  TfrmMain = class(TForm)
    PbProgress: TProgressBar;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    OnProgress: TProgress;  // Einfach so? Mhmmm...
  public
    { Public-Deklarationen }
  end;

var
  FileHandler: TFileHandler;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  FileHandler := TFileHandler.Create;
  FileHandler.FreeOnTerminate := True;
  FileHandler.FProgress := FileHandler.OnProgress; // oder FileHandler.OnProgress := FileHandler.OnProgress; ? Hier erhlste ich den Fehler "Nicht genügend Parameter"
end;

// Nach dem durchlaufen einer Runde in einer Schleife (eine Datei gehasht) kommt der Aufruf zum aktualisieren:
Synchronize(SyncProgress);

procedure TFileHandler.SyncProgress;
begin
  if Assigned(FProgress) then
    FProgress(0, FDoneFiles, FMaxFiles, FDoneFileSize, FMaxFileSize);
end;


Also es hapert noch am deklarieren und einbinde des OnProgress Events aus MainThread/MainForm Seite.
LuMa86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76



BeitragVerfasst: So 11.08.13 21:27 
Okay, hab bisschen rumprobiert, jetzt hat alles geklappt, einfacher als ich gedacht hätte :) Danke für die super Erklärung :)