Hi!
Zitat:
Das habe ich schon verstanden.
Aber die Funktionen, die der Thread aufruft, zeichnen ja auf der gleichen Form, in der der Thread läuft.
Der Thread läuft in keinem Form. Deine Forms laufen im Haupt/
VCL-Thread, das ist einer. Und dann gibt es noch deinen eigenen, erstellten Thread. Egal wo er deklariert ist oder gestartet wird, er läuft einfach immer neben dem
VCL-Thread und neben anderen eventuell vorhandenen Threads. So könnte das, was du brauchst, aussehen (einfach mal so niedergeschrieben, ohne Test):
Delphi-Quellcode:
type
MeinForm = class(TMeinForm)
lblThreadText: TLabel;
private
procedure StarteDenThread;
end;
type
Thread = class(TThread)
private
Form: TMeinForm;
procedure MachVCLSachen;
protected
procedure Execute; override;
public
constructor Create(Form: TMeinForm);
end;
procedure MeinForm.StarteDenThread;
begin
Thread.Create(Self);
end;
constructor Thread.Create(Form: TMeinForm);
begin
inherited Create(False);
Self.Form := Form;
end;
procedure Thread.Execute;
begin
// Kram machen
Synchronize(MachVCLSachen);
// Kram machen
end;
procedure Thread.MachVCLSachen;
begin
Form.lblThreadText := 'Der Thread lässt grüßen!';
end;
Mir fällt gerade auf, du erstellst den Thread ja per BeginThread. Synchronize ist eine Methode von TThread. Wenn du nicht TThread benutzen möchtest, müsstest du dir vermutlich einen eigenen Synchronisierungsmechanismus bauen.
Kleiner Nachtrag, weil du durch den Thread
VCL-Objekte erzeugen möchtest: Dir ist aber schon klar, dass Synchronize die Befehle an den Haupt-Thread weiterleitet, diese *nicht* in deinem eigenen Thread ausgeführt werden, und das Form dadurch beschäftigt ist/geblockt wird, oder? Wenn du nur
VCL-Dinge über den Thread erzeugen möchtest, wäre der Thread an der Stelle absolut überflüssig. Das nur noch nebenbei.