C++ вызов функции после времени или отмена

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

Аналогично тому, как работает JavaScript time = window.setTimeout("alert('Hello');", 500); а также if(time) clearTimeout(time)

Возможно ли это в базовом C++ без каких-либо дополнительных (нестандартных) библиотек или инфраструктуры? Если да, можете ли вы дать мне указатель в правильном направлении?

-

Я делаю это потому, что у меня есть запрос к БД, который занимает 3/4 секунды в первые несколько раз, и для этого отображается курсор ожидания, однако он выглядит немного глупо / отвлекающим после того, как запрос кешируется, и курсор мигает, ожидая и затем мигает до нормального состояния!

Спасибо за ваше время!

2 ответа

Решение

Вызов функции является блокирующей операцией. Я могу придумать пару способов приблизить поведение, которое вы хотите...

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

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

Библиотека GUI, которую вы используете, может упростить последующую опцию, но я не знаю, что вы используете.

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

Если функция должна быть отменена, мьютекс должен быть заблокирован при установке флага отмены.

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

Другие вопросы по тегам