Я нашел следующую реализацию для таймера обратного вызова для использования в моем приложении c ++. Однако эта реализация требует, чтобы я «присоединился» к потоку из вызывающей стороны start
, что эффективно блокирует вызывающую функцию запуска.
Что мне действительно нравится делать, так это следующее.
- кто-то может вызывать foo (данные) несколько раз и сохранять их в БД.
- всякий раз, когда вызывается foo (data), он запускает таймер на несколько секунд.
- во время обратного отсчета таймера, foo (data) можно назвать несколькими
время и несколько элементов могут быть сохранены, но не вызывает стирание, пока не закончится таймер
- всякий раз, когда таймер включен,
функция «Удалить» вызывается один раз, чтобы удалить все записи из
дб.
В сущности, я хочу иметь возможность выполнить задачу, подождать несколько секунд и выполнить пакетное задание одной партии B через несколько секунд.
class CallBackTimer {
public:
/**
* Constructor of the CallBackTimer
*/
CallBackTimer() :_execute(false) { }
/**
* Destructor
*/
~CallBackTimer() {
if (_execute.load(std::memory_order_acquire)) {
stop();
};
}
/**
* Stops the timer
*/
void stop() {
_execute.store(false, std::memory_order_release);
if (_thd.joinable()) {
_thd.join();
}
}
/**
* Start the timer function
* @param interval Repeating duration in milliseconds, 0 indicates the @func will run only once
* @param delay Time in milliseconds to wait before the first callback
* @param func Callback function
*/
void start(int interval, int delay, std::function<void(void)> func) {
if(_execute.load(std::memory_order_acquire)) {
stop();
};
_execute.store(true, std::memory_order_release);
_thd = std::thread([this, interval, delay, func]() {
std::this_thread::sleep_for(std::chrono::milliseconds(delay));
if (interval == 0) {
func();
stop();
} else {
while (_execute.load(std::memory_order_acquire)) {
func();
std::this_thread::sleep_for(std::chrono::milliseconds(interval));
}
}
});
}
/**
* Check if the timer is currently running
* @return bool, true if timer is running, false otherwise.
*/
bool is_running() const noexcept {
return ( _execute.load(std::memory_order_acquire) && _thd.joinable() );
}
private:
std::atomic<bool> _execute;
std::thread _thd;
};
Я попытался изменить приведенный выше код с помощью thread.detach (). Тем не менее, я запускаю проблемы в отдельном потоке не могу записать (стереть) из базы данных ..
Любая помощь и предложения приветствуются!