blob: 1f496acf38cb9d1bb84cf6bff3a67eb64c2928ea (
plain)
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
62
|
#ifndef WORKERS_HH
#define WORKERS_HH
#include <iostream>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/future.hpp>
//#include <boost/date_time/posix_time/posix_time_types.hpp>
#include "timing.h"
template <typename J, typename R>
class SimpleWorker
{
typedef boost::packaged_task<R> PackagedTask;
public:
SimpleWorker(J& job) : job(job), tasktime(0.0)
{
PackagedTask task(boost::bind(&SimpleWorker<J, R>::run, this));
future = task.get_future();
boost::thread t(boost::move(task));
}
R run() //this is called upon thread creation
{
R wresult = 0;
assert(job);
timer.Reset();
wresult = job();
tasktime = timer.Elapsed();
return wresult;
}
R getResult()
{
if (!future.is_ready())
future.wait();
assert(future.is_ready());
return future.get();
}
double getTaskTime()
{
return tasktime;
}
private:
J job;
boost::unique_future<R> future;
Timer timer;
double tasktime;
};
#endif
|