Zu der letzten Frage: Du kannst im Thread hochzählen, und gucken ob der Wert erreicht ist. Wenn das der Fall ist, rufst du ein Event im Hauptthread auf, in dem das ausgeführt wird, was passieren soll.
Um eine Methode im MainThread auszuführen musst du synchronize() verwenden.
Also z.B.
Delphi-Quellcode:
TMyThread = class(TThread)
i : Integer;
MainForm: TForm1;
// ...
procedure TMyThread.Execute()
begin
while i <= 1000
begin
inc(i)
sleep(50)
if i = 400 then
synchronize(Ausgabe);
end;
end;
procedure TMyThread.Ausgabe()
begin
MainForm.Label1.Caption := inttostr(i);
// oder
MainForm.DoSomething(i);
// oder
Mainform.DoSomething(Self);
end;