Выполнять функцию в определенное время

Я бы хотел, чтобы пользователь ввел время, например, 14:00 — что приведет к запуску функции в 14:00.

Как я могу это сделать?

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

редактировать: я не хочу использовать sleep() Функция, в идеале, так как проблема заключается в том, что клиенты будут запускаться в разное время, и гораздо удобнее в качестве решения вызвать что-то, что вызывает выполнение функции в 14:00.

1

Решение

Ты можешь использовать std::this_thread::sleep_until, например

void main()
{
auto fire_time = /**/;

std::thread thread([&]
{
std::this_thread::sleep_until(fire_time);
fire();
});
thread.join();
}

Вы можете преобразовать это в вспомогательную функцию, которая, вероятно, то, что вы ищете:

template<class Func, class Clock, class Duration>
void run_at(Func&& func, const std::chrono::time_point<Clock,Duration>& sleep_time)
{
std::thread(std::bind([&](const Func& func)
{
std::this_thread::sleep_until(sleep_time);
func();
}, std::move(func)))
.detach();
}
3

Другие решения

Если программа работает все время, используйте функцию, такую ​​как sleep ждать количество времени между настоящим моментом и 1400 часами. Возможно, вам придется сделать это в отдельном потоке, чтобы программа могла выполнять другие действия, или заменить sleep с таймаутом цикла события (если программа основана на цикле событий).

Если программа должна выйти, то вы должны использовать системное средство, такое как at в Unix — организовать перезапуск программы и выполнение кода в указанное время.

1

Я считаю, что вам нужен какой-то менеджер задач. Это базовая модель. Разведение спящих нитей — очень неправильный способ сделать эту работу. Один менеджер будет знать, когда выполнять следующую задачу. Как запустить задачу это другой вопрос. Вы можете создавать новые темы для каждой задачи, если хотите, чтобы они были интерактивными. Или вы можете сериализовать их и запустить из потока менеджера.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector