Я не претендую на звание эксперта по многопоточности, но я думаю, что это сработает:
interface
type
TProcRef = reference to procedure;
TWorkerThread = class(TThread)
public
proc: TProcRef;
procedure Execute; override;
class procedure RunInThread(AProc: TProcRef);
end;
implementation
procedure TWorkerThread.Execute;
begin
inherited;
proc;
end;
class procedure TWorkerThread.RunInThread(AProc: TProcRef);
begin
with TWorkerThread.Create(true) do
begin
FreeOnTerminate := true;
proc := AProc;
Resume;
end;
end;
Тогда, если у вас есть какая-либо процедура, например
procedure P;
begin
while true do
begin
sleep(1000);
beep;
end;
end;
, выможно просто сделать
procedure TForm1.Button1Click(Sender: TObject);
begin
TWorkerThread.RunInThread(P);
end;
можно даже сделать
TWorkerThread.RunInThread(procedure begin while true do begin sleep(1000); beep; end; end);