我正在编写一个必须在后台执行某些操作的应用程序:检查电子邮件并解析它们以在数据库中注入一些数据,并连接到Web服务以检查某些异步操作的状态。
现在,我的解决方案是一个简单的计时器,可以按照预定义的时间表执行这些操作:每五分钟发送一次电子邮件,每分钟都会检查一次Web服务(但这些仅在有待处理的活动时执行,因此大部分时间都是这样什么都不做。)
现在我没有使用线程(我在开发阶段的早期。)但我的计划是创建一个后台线程并让它离线完成工作。
几个问题:
请记住,我对线程没有经验。我写了一个FTP同步应用程序,所以我不是一个完整的新手,但那是很久以前的事了。
答案 0 :(得分:6)
对于问题的第3部分,Windows API具有GetLastInputInfo函数,该函数应返回有关用户上次执行操作的信息。它甚至说它是 “此功能对输入空闲检测很有用”。我本来打算用它来做这件事,但没有机会测试它。
答案 1 :(得分:1)
你能不能在后台线程中完成所有这些,摆脱所有的线程微管理?在我看来,你可以在后台线程中循环调用sleep(60000)。每次循环检查Web服务,每5轮检查一次电子邮件。如果需要,你可以将优先级设置为tpLower,但是这个线程几乎一直在I / O上休眠或阻塞,所以我认为它甚至不值得输入。
如果这个线程对于键盘/鼠标的用户来说是明显的,无论它何时运行,我都会感到惊讶。
'设置一个全局变量(基本的“锁定”,)启动线程' - 这个全局变量打算做什么?有什么可以锁定的?
答案 2 :(得分:1)
- 我计划控制计时器中的所有内容。设置一个全局变量(基本的“锁定”),启动线程。如果已经设置了“锁定”,请忽略它。线程在终止时清除它。我应该为我的线程使用更强大的锁定/队列机制吗? (我已经安装了OmniThread)
醇>
我根本不打扰计时器。让你的线程循环看起来像这样,你会有你的延迟。您不需要锁定,因为只有一个线程,在上一个作业结束之前它不会休眠。
procedure YourThread;
var N: Integer;
begin
while not Terminated do
begin
// Figure out if there's a job to do
// Do the job
// Sleep for a while, but give the thread a chance to notice
// it needs to terminate.
for N := 1 to 500 do
if not Terminated then
Sleep(100);
end;
end;
- 如何运行优先级较低的线程?当后台线程执行数据插入或联网时,我不希望应用程序感到迟钝。
醇>
不要打扰。您可以轻松使用SetThreadPriority,但这不值得。如果后台线程正在等待I / O(网络),那么它将不会消耗任何CPU资源。即使您的后台线程全速工作,您的GUI也不会感觉迟钝,因为Windows可以很好地在所有可用线程中分配可用的CPU时间。
- 是否有一种干净的方法来验证用户活动并仅在用户不忙于键盘/鼠标时启动此线程?
醇>
再次,为什么还要检查用户活动?检查电子邮件是网络(即:I / O)绑定,检查电子邮件的线程主要是是空闲的。