source: trunk/MagicSoft/Control/SubsystemIO/PeriodicAction.hxx@ 5138

Last change on this file since 5138 was 1054, checked in by casaldaliga, 23 years ago
changed .H to .hxx in includes to work with new naming
File size: 2.9 KB
Line 
1#ifndef PERIODICACTION
2#define PERIODICACTION
3/**
4 * Class for periodically calls to a slot: a global function or a method of a
5 * given object.
6 *
7 * Connects the slot to a PeriodicSignal, that wraps a thread, which
8 * periodically will call the doWhile[doWhileNot] slot until this returns
9 * false[true]. If a FinallyDo action is registered, when the PeriodicAction
10 * has finished it will call this finalizing slot
11 *
12 * To wrap the doWhile, doWhileNot or FinallyDo action properly (type safer
13 * than pointer to functions, better object oriented), call the slot factory:
14 *
15 * slot(global_function)
16 * slot(anObject,&Object::Method)
17 *
18 * EXAMPLE: -----------------------------------------------------------------
19 *
20 * class Counter: public Object{
21 * Counter(int max, int incr);
22 * bool isIncrementPossible();
23 * void PrintIAmDone();
24 * };
25 *
26 * bool end;void endMe(){end=true;}
27 *
28 * int main(){
29 * end=false;
30 * Counter byTwo(100,2), byThree(100,3);
31 *
32 * PeriodicAction byTwoEachSec(1000000);
33 * byTwoEachSec.DoWhile(slot(byTwo,&Counter::isIncrementPossible));
34 * byTwoEachSec.FinallyDo(slot(byTwo,&Counter::PrintIAmDone));
35 * byTwoEachSec.Start();
36 *
37 * PeriodicAction byThreeEachTwoSec(2000000);
38 * byThreeEachTwoSec.DoWhile(slot(byThree,&Counter::isIncrementPossible));
39 * byThreeEachTwoSec.FinallyDo(slot(endMe));
40 * byThreeEachTwoSec.Start();
41 *
42 * while(!end){
43 * }
44 * }
45 * ----------------------------------------------------------------------------
46 *
47 * Pending: Define behaviour of synchronization of diferent periodicactions
48 *
49 * Implementation Pending: Check the periodicaction is not running before
50 * starting, and it is running before stopping it. (With
51 * PeriodicSignal::isRunning)
52 *
53 * Implementation Pending: Not thread safe when two periodic actions may
54 * access the same variables
55 */
56
57
58#include "PeriodicSignal.hxx"
59//for signals, and Object
60#include <sigc++/signal_system.h>
61using namespace SigC;
62
63class PeriodicAction: public Object {
64
65public:
66 /** Aproximate period (+-500ms) in microsec (so, greater than 500000)
67 * to repeat doWhile or doWhileNot actions
68 * @see #doWhile
69 * @see #doWhileNot
70 */
71 unsigned int period;
72public:
73 PeriodicAction( unsigned int period_);
74
75 PeriodicAction ( unsigned int period_, const Slot0<bool> & doWhileData,
76 const Slot0<void> & finallyData );
77 void DoWhileNot( const Slot0<bool> & s);
78 void DoWhile(const Slot0<bool> &s);
79 void FinallyDo( const Slot0<void> & s);
80 void Start();
81 void Stop();
82// void SetPeriod(unsigned long int period_);
83private:
84 PeriodicSignal periodic;
85 Connection actionConn,periodConn;
86
87 Signal0<bool> doWhile;
88 Signal0<bool> doWhileNot;
89
90 Signal0<void> finally;
91
92 void DoItOnceAndCheckContinuance();
93 void DoItOnceAndCheckContinuance_Not();
94};
95
96
97
98#endif
Note: See TracBrowser for help on using the repository browser.