gpt4 book ai didi

multithreading - 如何实现使用最少资源定期检查某些内容的线程?

转载 作者:行者123 更新时间:2023-12-03 14:37:22 24 4
gpt4 key购买 nike

我希望有一个线程在后台运行,它将以给定的时间间隔检查与某些服务器的连接。例如每 5 秒一次。

不知道这方面有没有好的“设计模式”?如果我没记错的话,我读过一些文章,在它的执行方法中休眠线程是不好的。但我可能是错的。

此外,我可以使用普通的 TThread 类或 OTL 线程库。

有什么想法吗?

谢谢。

最佳答案

OmniThreadLibrary ,你会这样做:

uses
OtlTask,
OtlTaskControl;

type
TTimedTask = class(TOmniWorker)
public
procedure Timer1;
end;

var
FTask: IOmniTaskControl;

procedure StartTaskClick;
begin
FTask := CreateTask(TTimedTask.Create())
.SetTimer(1, 5*1000, @TTimedTask.Timer1)
.Run;
end;

procedure StopTaskClick;
begin
FTask.Terminate;
FTask := nil;
end;

procedure TTimedTask.Timer1;
begin
// this is triggered every 5 seconds
end;

至于在执行中休眠 - 这取决于你如何做。如果您使用 sleep ,那么这可能不是很明智(例如,因为它会阻止线程在 sleep 期间停止)。与 WaitForSingleObject 一起 sleep 就可以了。

TThread 和 WaitForSingleObject 的示例:

type
TTimedThread = class(TThread)
public
procedure Execute; override;
end;

var
FStopThread: THandle;
FThread: TTimedThread;

procedure StartTaskClick(Sender: TObject);
begin
FStopThread := CreateEvent(nil, false, false, nil);
FThread := TTimedThread.Create;
end;

procedure StopTaskClick(Sender: TObject);
begin
SetEvent(FStopThread);
FThread.Terminate;
FThread.Free;
CloseHandle(FStopThread);
end;

{ TTimedThread }

procedure TTimedThread.Execute;
begin
while WaitForSingleObject(Form71.FStopThread, 5*1000) = WAIT_TIMEOUT do begin
// this is triggered every 5 seconds
end;
end;

OTL定时器实现与上面的TThread代码类似。 OTL 计时器保存在优先级列表中(基本上计时器按“下一次发生”时间排序),TOmniWorker 中的内部 MsgWaitForMultipleObjects 调度程序为最高优先级计时器指定适当的超时值。

关于multithreading - 如何实现使用最少资源定期检查某些内容的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8412254/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com