Bonsoir,
Je veux faire un scheduler. Il s'agit d'une classe singleton à laquelle on va ajouter des taches (interface Task). Les Task implémentent une méthode pour l'opérateur <, ce qui permet au scheduler d'ordonnacer les tâches selon
l'heure à laquelle on voudrait les lancer et leur priorité.
A terme, l'objectif est que le scheduler fasse tourner un thread qui va entretenir une horloge temps réel et une horloge virtuelle qui vont servir à lancer les différentes tâches (méthode virtuelle pure "run").
Voilà pour le décor.
J'ai commencé par faire un singleton en reprenant ce que j'ai trouvé sur un des tutos de developpez (au final ça ne fonctionnait pas, j'en suis revenu à un bête copié/collé), ainsi que ma classe Scheduler.
Malheureusement, quand j'essaye de récupérer mon scheduler, le compilo me dit que la méthode n'est pas définie..
La class template singleton
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 /* * Singleton.h * * Created on: 5 sept. 2010 * Author: seeme */ //Not safe in multithread! Be carreful.. #ifndef SINGLETON_H_ #define SINGLETON_H_ template <class T> class Singleton{ public: static T* get(); static void kill(); protected: static T* m_i; private: T& operator=(const T&){} }; #endif /* SINGLETON_H_ */Et le scheduler
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 /* * Singleton.h * * Created on: 5 sept. 2010 * Author: seeme */ //Not safe in multithread! Be carreful.. #include "Singleton.h" template <class T> T* Singleton<T>::m_i=0; template <class T> T* Singleton<T>::get(){ if(m_i==0){ m_i=new T(); } return m_i; } template <class T> void Singleton<T>::kill(){ delete m_i; m_i=0; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 /* * Scheduler.h * * Created on: 5 sept. 2010 * Author: seeme */ #ifndef SCHEDULER_H_ #define SCHEDULER_H_ #include <list> #include <ctime> #include "Task.h" #include "../Tools/Singleton.h" #include <ostream> #include <iterator> class Scheduler: public Singleton<Scheduler>{ friend Scheduler* Singleton<Scheduler>::get(); friend void Singleton<Scheduler>::kill(); private: std::list<Task*>* m_taskList; unsigned long m_virtualTime; void run(); Scheduler(); ~Scheduler(); public: void addTask(Task* t); virtual void print(std::ostream& o) const { o << "Scheduler: " << std::endl; std::list<Task*>::iterator it; it = m_taskList->begin(); while(it != m_taskList->end()){ o << **it << std::endl; it++; } } friend std::ostream& operator<<(std::ostream& out, const Scheduler& v){ v.print(out); return out; } }; struct Compar { bool operator()(Task* left, Task* right){ return (*left < *right); } }; #endif /* SCHEDULER_H_ */et un exemple d'utilisation qui plante lamentablement:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 /* * Scheduler.cpp * * Created on: 5 sept. 2010 * Author: seeme */ #include "Scheduler.h" #include <iostream> Scheduler::Scheduler() { m_taskList = new std::list<Task*>(); m_virtualTime = 0; std::cout << "Constructor" << std::endl; } Scheduler::~Scheduler() { //All remaining task are to be deleted while(m_taskList->begin() != m_taskList->end()) delete *m_taskList->begin(); std::cout << "Destructor" << std::endl; } void Scheduler::addTask(Task* t){ m_taskList->push_back(t); m_taskList->sort(Compar()); }
Merci d'avance
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 /* * Main.cpp * * Created on: 29 août 2010 * Author: seeme */ #include "Main.h" #include "Scheduler/Scheduler.h" #include <iostream> using namespace std; int main(int argc, char**argv){ Scheduler::get(); // <-- undifined ref to Singleton<Scheduler>::get() /*Scheduler * s = Singleton<Scheduler>::get(); s->addTask(new Task("Une tache", 10, 1, 1, NORMAL)); Scheduler::kill();*/ return 0; }
Seeme
Partager