Zdravíčko, vedel by niekto poradiť ako urobiť timer v Linuxe tak, aby sa čo najviac podobal timeru z WinAPI? V Linuxe som začiatočník ale skúšal som niečo takéto: http://www.graphics-muse.org/wp/?p=868, bohužiaľ to nefunguje podľa predstáv, pokiaľ napr. pauznem program pomocou getline(...), tak vyvolanie signálu timera funkciu getline zruší, podobne getchar. Z WinAPI si vystačím s CreateTimerQueueTimer, potrebujem viacero timerov pre rôzne vlákna bez toho, aby iné vlákna alebo nebodaj celý proces pri ticku jedného dostali "signál" či ako to v linuxe chodí
Fórum › C / C++
Timer v C pre Linux
#2 voty
Požiadavka je jednoduchá, timer by mal volať statickú funkciu určitý interval od vytvorenia timeru a pokiaľ sa nastaví aj perióda, tak aby ju volal periodicky. Volanie "tick" funkcie by ale nemalo spôsobovať odblokovanie iných funkcií, napr. pokiaľ som použil getline alebo getchar, akonáhle program obdržal tick tak obidve funkcie "zlyhali". A veľmi dôležité je, aby timer obsahoval minimálne jeden nastaviteľný parameter (používam to ako adresu objektu timeru, ktorý mám pod Win urobený ako triedu)
Vďaka
#3 Thew
Jasně, už začínám trochu tušit. Podle mého by mělo vyhovovat použití create_timer, kde se ve struktuře sigevent využije možnost sigsev_notify nastavenou na SIGSEV_THREAD a do parametrů se předá funkce, která se má volat plus ukazatel na parametry. Když timer expiruje tak založí nové vlákno (thread), ve kterém spustí zadanou funkci.
viz man timer_create, man sigevent
#4 voty
Vďaka! funguje, tu je kód pre tých, ktorých by to zaujímalo:
#include <signal.h>
#include <time.h>
typedef void (*PTimerCallback) (sigval_t);
void CreateTimer(timer_t * timerID, unsigned int dueTime,
unsigned int period, PTimerCallback handler, void * arg)
{
if (!timerID || !dueTime || !handler)
return;
struct sigevent timerEvent = { 0 };
timerEvent.sigev_notify = SIGEV_THREAD;
timerEvent.sigev_notify_function = handler;
timerEvent.sigev_value.sival_ptr = arg;
timer_create(CLOCK_REALTIME, &timerEvent, timerID);
itimerspec timerspec = {
period / 1000, (period % 1000) * 1000000,
dueTime / 1000, (dueTime % 1000) * 1000000 };
timer_settime(*timerID, 0, &timerspec, 0);
}
void tick(sigval_t arg)
{
// ... tick
}
int main()
{
timer_t timer;
CreateTimer(&timer, 1000, 2000, tick, 0);
// ...
// ...
timer_delete(timer);
return 0;
}
dueTime a period sú časy v milisekundách, dueTime určuje, za koľko ms od vytvorenia sa zavolá handler prvýkrát, period (pokiaľ > 0) určuje, v akom intervale sa bude handler volať nasledovne dookola...
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Editor pre linux — založil Tom@sQo
Progrmaovanie pre linux — založil janik366
Linux len pre RDP — založil ing
Linux pre začiatočníckeho užívateľa + príslušenstvo — založil Tocimanko
Knižnice/triedy na prácu s informáciami hardvéru pre Linux — založil Lordest
Moderátoři diskuze