Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Problem mit Thread Synchronize
LuMa86 - So 11.08.13 18:42
Titel: Problem mit Thread Synchronize
Hallo,
ich habe mich jetzt mal durch das Thema Threads gearbeitet. Allerdings hänge ich an einer Stelle (Meine Quelle:
http://wiki.delphigl.com/index.php/Tutorial_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:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TFileHandler.SyncProgress; 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:
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; public property Progress: TProgress read FProgress write FProgress; protected procedure Execute; override; end;
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
Narses: Topic aus Sonstiges (Delphi) verschoben am Di 13.08.2013 um 10:26
Nersgatt - So 11.08.13 19:45
LuMa86 hat folgendes geschrieben : |
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:
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
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
Delphi-Quelltext
1:
| property OnProgress: TProgress read FProgress write FProgress; |
Dann weiß man gleich, dass das ein Event ist.
LuMa86 - So 11.08.13 19:58
Ah, und der Zugriff auf die Progressbar, findet dann in dem Costum Event statt?
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; public property Progress: TProgress read FProgress write FProgress; protected procedure Execute; override; end;
TfrmMain = class(TForm) PbProgress: TProgressBar; procedure FormCreate(Sender: TObject); private OnProgress: TProgress; public end;
var FileHandler: TFileHandler;
procedure TfrmMain.FormCreate(Sender: TObject); begin FileHandler := TFileHandler.Create; FileHandler.FreeOnTerminate := True; FileHandler.FProgress := FileHandler.OnProgress; end;
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 - 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 :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!