Обнаружение низкой активности пользователей и проверка электронной почты на фоне - PullRequest
5 голосов
/ 13 марта 2012

Я пишу приложение, которое должно выполнять некоторые действия в фоновом режиме: проверять электронную почту и анализировать их, чтобы вставить некоторые данные в базу данных, и подключиться к веб-службе для проверки состояния некоторых асинхронных операций.

В настоящее время мое решение представляет собой простой таймер, который выполняет эти операции по заранее заданному расписанию: отправка электронной почты каждые пять минут и проверка веб-службы каждую минуту (но они выполняются только при наличии ожидающих действий, поэтому большую часть времени это ничего не делает.)

Прямо сейчас я не использую поток для этого (я нахожусь на ранней стадии разработки.) Но я планирую создать фоновый поток и позволить ему делать работу в автономном режиме.

Пара вопросов:

  1. Я планирую контролировать все в таймере (ах). Установите глобальную переменную (элементарную блокировку), чтобы запустить поток. Если «блокировка» уже установлена, игнорируйте ее. Нить очищает его по окончании. Должен ли я использовать более надежный механизм блокировки / очереди для своих потоков? (У меня уже установлен OmniThread)
  2. Как запустить поток с низким приоритетом? Я не хочу, чтобы приложение чувствовало себя вялым, когда фоновый поток выполняет вставку данных или работу в сети.
  3. Существует ли чистый способ проверки активности пользователя и запуска этой цепочки только в том случае, если пользователь не занят клавиатурой / мышью?

Пожалуйста, имейте в виду, что у меня нет опыта работы с нитями. Однажды я написал приложение для синхронизации по FTP, поэтому я не новичок, но это было давно.

Ответы [ 3 ]

6 голосов
/ 13 марта 2012

В части 3 вашего вопроса в Windows API есть функция GetLastInputInfo , которая должна возвращать информацию о том, когда пользователь в последний раз что-то делал.Он даже говорит, что «Эта функция полезна для обнаружения простоя входа».Я планировал использовать это для чего-то сам, но у меня не было возможности проверить это.

Редактировать: Ссылка на реализацию Delphi

1 голос
/ 13 марта 2012
  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;
  1. Как запустить поток с низким приоритетом?Я не хочу, чтобы приложение чувствовало себя вялым, когда фоновый поток выполняет вставку данных или работу в сети.

Не беспокойтесь.Вы можете легко использовать SetThreadPriority , но это того не стоит.Если ваш фоновый поток ожидает ввода-вывода (работа в сети), он не будет потреблять ресурсы процессора.Даже если ваш фоновый поток работает на полной скорости, ваш графический интерфейс не будет вялым, поскольку Windows хорошо распределяет доступное время ЦП между всеми доступными потоками.

  1. Есть ли чистый способпроверять активность пользователя и запускать эту тему только тогда, когда пользователь не занят клавиатурой / мышью?

Опять же, зачем беспокоиться о проверке активности пользователя?Проверка электронной почты связана с сетью (т. Е. С I / O), поток проверки электронной почты будет в основном бездействовать.

1 голос
/ 13 марта 2012

Можете ли вы просто не делать все это в фоновом потоке, избавляясь от всех потоков микро-управления?Сдается мне, что вы могли бы просто зацикливаться на сон (60000) вызов в фоновом потоке.Проверяйте веб-сервис каждый раз в цикле, проверяйте электронную почту каждые 5 раз.Вы можете установить приоритет tpLower, если хотите, но этот поток будет постоянно находиться в режиме ожидания или блокироваться при вводе / выводе, поэтому я не думаю, что он даже стоит набирать.

Iбыло бы удивительно, если бы такой поток вообще был заметен пользователю на клавиатуре / мыши, независимо от того, когда он запускается.

'Установить глобальную переменную (элементарное "блокирование",) запустить поток "-для чего предназначена эта глобальная переменная?Что там блокировать?

...