Как вариант можно воспользоваться планировщиком задач, встроенным в операционную систему.
Под Windows можно создать задачу в планировщике, которая будет выполняться, когда система уходит в idle состояние, наверняка в Linux и Mac есть нечто подобное.
Можно конечно и в ручную, но тут не все так просто и нужен комплексный подход:
процессор, диск, сеть, пользовательский ввод,
SetThreadExecutionState, полноэкранные, приложения и т.п.
К примеру если пользователь смотрит фильм, то это ведь не idle, и подход, предложенный пользователем
ixSci, как минимум будет работать не верно. Также возможны ситуации, когда процессор простаивает, но при этом активно выполняются дисковые операции, либо идет активная работа с сетью.
Еще полезно понизить приоритет фоновой задачи.
Для Windows см.
SetThreadPriority с флагом THREAD_MODE_BACKGROUND_BEGIN.
Также, если подходить основательно, то необходимо отслеживать выход из idle, и останавливать задачу.