Timer v C pre Linux – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Timer v C pre Linux – C / C++ – Fórum – Programujte.comTimer v C pre Linux – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Thew0
Newbie
30. 10. 2012   #1
-
0
-

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í  

Nahlásit jako SPAM
IP: 195.168.209.–
Get off the cross, we need the wood
voty+1
Návštěvník
1. 11. 2012   #2
-
0
-

#1 Thew
Vytvořit v Linuxu timer není problém, jen mi není ze zadání jasné, jak se má chovat, protože WinAPI neznám. Nešlo by požadavky trochu rozepsat?

Nahlásit jako SPAM
IP: 109.239.71.–
Jednu rozbil a tu druhou ztratil.
Thew0
Newbie
1. 11. 2012   #3
-
0
-

#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

Nahlásit jako SPAM
IP: 195.168.209.–
Get off the cross, we need the wood
voty+1
Návštěvník
1. 11. 2012   #4
-
+1
-
Zajímavé

#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

Nahlásit jako SPAM
IP: 109.239.71.–
Jednu rozbil a tu druhou ztratil.
Řešení
Thew0
Newbie
1. 11. 2012   #5
-
+1
-
Zajímavé
Vyřešeno Nejlepší odpověď

#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...

Nahlásit jako SPAM
IP: 195.168.209.–
Get off the cross, we need the wood
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 49 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý