我正在尝试在Delphi中构建一个通用工作线程,我可以将一个函数/过程(无关紧要)作为参数传递并让它执行。
我的猜测是在TThread
课程中添加一个字段,然后从TThread.Execute
调用该字段。
所以线程之外的代码将是:
MyThread := TWorkerThread.Create(True); Mythread.CallBackF := @Foo; try MyThread.Resume; except MyThread.Free; end;
如何在@foo
中保留TWorkerThread
的引用,并在Execute
内调用它?
答案 0 :(得分:6)
此外,使用通用线程的良好开端是AsyncCalls或Omni Thread Library。
答案 1 :(得分:4)
我不假装自己是线程专家,但我认为这样做会:
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);
答案 2 :(得分:4)
查看QueueUserWorkItem功能。
它在线程中执行任意函数,而不需要您创建一个。 只是不要忘记将IsMultithreaded全局变量切换为True。