קוד: |
timer_settime |
קוד: |
std::function |
קוד: |
struct Timer { std::function<void()> callback; int64_t millies; bool repeating; Timer(); auto start() -> void; private: static auto handler(int sig, siginfo_t *si, void *uc) -> void; struct sigaction sa; struct sigevent sev; struct itimerspec its; timer_t timerid; }; Timer::Timer() { sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = handler; sigemptyset(&sa.sa_mask); if (sigaction(SIGRTMIN, &sa, NULL) == -1) { // errExit("sigaction"); return; } sev.sigev_notify = SIGEV_SIGNAL; sev.sigev_signo = SIGRTMIN; sev.sigev_value.sival_ptr = &timerid; sev.sigev_value.sival_ptr = this; if (timer_create(CLOCK_REALTIME, &sev, &timerid) == -1) { // assert("timer_create"); return; } } auto Timer::start() -> void { its.it_value.tv_sec = millies / 1000; its.it_value.tv_nsec = millies % 1000; its.it_interval.tv_sec = its.it_value.tv_sec; its.it_interval.tv_nsec = its.it_value.tv_nsec; if (timer_settime(timerid, 0, &its, NULL) == -1) { // error } } auto Timer::handler(int sig, siginfo_t *si, void *uc) -> void { Timer *timer = static_cast<Timer *>(si->si_value.sival_ptr); timer->callback(); } ... int main() { Timer t1; t1.millies = 2000; t1.callback = [&i, &logger]() { i++; logger->info("Timer"); }; // or some other blocking function while (1) {}; return ; }; |
קוד: |
#include <iostream> #include <chrono> #include <atomic> #include <thread> std::atomic<bool> stop_flag(false); void timer_callback() { std::cout << "Timer callback\n"; } void start_timer(int interval, std::function<void()> callback) { while (!stop_flag.load()) { std::chrono::milliseconds timespan(interval); std::this_thread::sleep_for(timespan); callback(); } } int main() { std::thread timer_thread(start_timer, 1000, timer_callback); // Do some other work here // ... // Stop the timer thread stop_flag.store(true); timer_thread.join(); return 0; } |
קוד: |
auto Timer::start() -> void { struct sigevent sev; memset(&sev, 0, sizeof sev); sev.sigev_notify = SIGEV_THREAD; sev.sigev_notify_function = &Timer::handler; sev.sigev_value.sival_ptr = this; timer_t timerid = 0; int ret = timer_create(CLOCK_MONOTONIC, &sev, &timerid); if (ret) { ret = errno; exit(1); } // Arm the timer to expire in the specified interval. struct itimerspec trigger; memset(&trigger, 0, sizeof trigger); trigger.it_value.tv_sec = millies / 1000; trigger.it_value.tv_nsec = millies % 1000; trigger.it_interval.tv_sec = trigger.it_value.tv_sec; trigger.it_interval.tv_nsec = trigger.it_value.tv_nsec; ret = timer_settime(timerid, 0, &trigger, NULL); if (ret) { ret = errno; exit(1); } } auto Timer::handler(sigval sival_int) -> void { Timer *timer = static_cast<Timer *>(sival_int.sival_ptr); timer->callback(); } |
קוד: |
set unwindonsignal off |
Anonymous : | ||
ניסית ב gdb לכתוב
? במידה ואתה סוגר את האפשרות, האם זה עדיין מקריס? |