source: Sophya/trunk/SophyaLib/SysTools/periodic.cc@ 433

Last change on this file since 433 was 241, checked in by ansari, 26 years ago

ppersist + pexc

File size: 1.9 KB
Line 
1/* Classe d'objets avec une methode (DoPeriodic()) appelee periodiquement */
2/* Eric Aubourg 04/96 */
3/* Reza Ansari 06/96 */
4/* LAL/IN2P3 (Orsay) DAPNIA/CEA (Saclay) */
5
6#include "machdefs.h"
7#include <signal.h>
8#include <unistd.h>
9
10#include "periodic.h"
11
12/* --Methode-- */
13Periodic::Periodic(int dt, UsPeriodicAction act, void * usp)
14{
15mDt = dt;
16mAct = act;
17mUsp = usp;
18if (mDt < 1) mDt = 5;
19mDtms = 1000*mDt;
20mFgact = false;
21it = -1;
22}
23
24/* --Methode-- */
25Periodic::~Periodic()
26{
27if (mFgact) Stop();
28}
29
30/* --Methode-- */
31void Periodic::SetAction(UsPeriodicAction act, void * usp)
32{
33mAct = act;
34mUsp = usp;
35}
36
37/* --Methode-- */
38void Periodic::SetInterval(int dt)
39{
40mDt = dt;
41if (mDt < 1) mDt = 5;
42mDtms = 1000*mDt;
43}
44
45/* --Methode-- */
46void Periodic::SetIntervalms(int dtms)
47{
48if (dtms < 1) dtms = 5;
49mDtms = dtms;
50mDt = mDtms/1000;
51if (mDt < 1) mDt = 1;
52}
53
54/* --Methode-- */
55void Periodic::Start(int dt)
56{
57if (mFgact) return;
58if (dt > 0) { mDt = dt; mDtms = dt*1000; }
59if (!actifs) actifs = new PeriodicList;
60it = 0;
61if (actifs->size() == 0) {
62 signal(SIGALRM, CallBack);
63 alarm(1);
64 }
65actifs->push_back(this);
66mFgact = true;
67return;
68}
69
70/* --Methode-- */
71void Periodic::Stop()
72{
73if (!mFgact) return;
74
75//remove(actifs->begin(), actifs->end(), this); // $CHECK$ - Reza
76actifs->remove(this); // $CHECK$
77if (actifs->size() == 0) {
78 signal(SIGALRM, SIG_IGN);
79 alarm(0);
80 delete actifs;
81 actifs = NULL;
82 }
83it = -1; mFgact = false;
84return;
85}
86
87/* --Methode-- */
88void Periodic::DoPeriodic()
89{
90if (mAct) mAct(mUsp);
91}
92
93PeriodicList* Periodic::actifs = NULL;
94
95void Periodic::CallBack(int)
96{
97 if (!actifs) return;
98
99 for (PeriodicList::iterator i = actifs->begin(); i != actifs->end(); i++) {
100 Periodic* p = (Periodic*) *i;
101 p->it ++;
102 if (p->it >= p->mDt) {
103 p->it = 0;
104 p->DoPeriodic();
105 }
106 }
107 alarm(1);
108}
109
Note: See TracBrowser for help on using the repository browser.