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_ */
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;
}
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
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_ */
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());
}
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
 
/*
 * 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;
}
Merci d'avance
Seeme