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

Leo*_*era 5 delphi multithreading delphi-xe

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

现在,我的解决方案是一个简单的计时器,它按照预定义的时间表执行这些操作:每隔五分钟发送一次电子邮件,每分钟进行一次Web服务检查(但只有在有待处理的活动时才会执行这些操作,因此大多数情况下这不执行任何操作)

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

几个问题:

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

请记住,我没有线程经验.我写了一个FTP同步应用程序,所以我不是一个完整的新手,但很久以前.

Kie*_*ran 6

对于问题的第3部分,Windows API具有GetLastInputInfo函数,该函数应返回有关用户上次执行某些操作的信息.它甚至表示"此功能对输入空闲检测很有用".我确实打算自己用这个东西,但没有机会测试它.

编辑:Delphi实现链接


Cos*_*und 1

  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;
Run Code Online (Sandbox Code Playgroud)
  1. 如何运行低优先级的线程?我不希望应用程序在后台线程执行数据插入或联网时感到缓慢。

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

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

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

  • 在一个线程中休眠 50 秒有点过头了。请记住,当需要杀死线程时,应用程序在最坏的情况下将挂起 50 秒...... (4认同)