检测低用户活动并检查背景上的电子邮件

时间:2012-03-13 15:08:34

标签: multithreading delphi delphi-xe

我正在编写一个必须在后台执行某些操作的应用程序:检查电子邮件并解析它们以在数据库中注入一些数据,并连接到Web服务以检查某些异步操作的状态。

现在,我的解决方案是一个简单的计时器,可以按照预定义的时间表执行这些操作:每五分钟发送一次电子邮件,每分钟都会检查一次Web服务(但这些仅在有待处理的活动时执行,因此大部分时间都是这样什么都不做。)

现在我没有使用线程(我在开发阶段的早期。)但我的计划是创建一个后台线程并让它离线完成工作。

几个问题:

  1. 我计划控制计时器中的所有内容。设置一个全局变量(基本的“锁定”),启动线程。如果已经设置了“锁定”,请忽略它。线程在终止时清除它。我应该为我的线程使用更强大的锁定/队列机制吗? (我已经安装了OmniThread)
  2. 如何运行优先级较低的线程?当后台线程执行数据插入或联网时,我不希望应用程序感到迟钝。
  3. 是否有一种干净的方法来验证用户活动并仅在用户不忙于键盘/鼠标时启动此线程?
  4. 请记住,我对线程没有经验。我写了一个FTP同步应用程序,所以我不是一个完整的新手,但那是很久以前的事了。

3 个答案:

答案 0 :(得分:6)

对于问题的第3部分,Windows API具有GetLastInputInfo函数,该函数应返回有关用户上次执行操作的信息。它甚至说它是 “此功能对输入空闲检测很有用”。我本来打算用它来做这件事,但没有机会测试它。

修改:Delphi implementation link

答案 1 :(得分:1)

你能不能在后台线程中完成所有这些,摆脱所有的线程微管理?在我看来,你可以在后台线程中循环调用sleep(60000)。每次循环检查Web服务,每5轮检查一次电子邮件。如果需要,你可以将优先级设置为tpLower,但是这个线程几乎一直在I / O上休眠或阻塞,所以我认为它甚至不值得输入。

如果这个线程对于键盘/鼠标的用户来说是明显的,无论它何时运行,我都会感到惊讶。

'设置一个全局变量(基本的“锁定”,)启动线程' - 这个全局变量打算做什么?有什么可以锁定的?

答案 2 :(得分:1)

  
      
  1. 我计划控制计时器中的所有内容。设置一个全局变量(基本的“锁定”),启动线程。如果已经设置了“锁定”,请忽略它。线程在终止时清除它。我应该为我的线程使用更强大的锁定/队列机制吗? (我已经安装了OmniThread)
  2.   

我根本不打扰计时器。让你的线程循环看起来像这样,你会有你的延迟。您不需要锁定,因为只有一个线程,在上一个作业结束之前它不会休眠。

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;
  
      
  1. 如何运行优先级较低的线程?当后台线程执行数据插入或联网时,我不希望应用程序感到迟钝。
  2.   

不要打扰。您可以轻松使用SetThreadPriority,但这不值得。如果后台线程正在等待I / O(网络),那么它将不会消耗任何CPU资源。即使您的后台线程全速工作,您的GUI也不会感觉迟钝,因为Windows可以很好地在所有可用线程中分配可用的CPU时间。

  
      
  1. 是否有一种干净的方法来验证用户活动并仅在用户不忙于键盘/鼠标时启动此线程?
  2.   

再次,为什么还要检查用户活动?检查电子邮件是网络(即:I / O)绑定,检查电子邮件的线程主要是是空闲的。