我使用set HEAP=-Xms512m -Xmx1024m
定期调用函数。
我需要deadline_timer and pthread_t
的返回值。
该功能需要大约60毫秒才能处理。
我喜欢每隔10毫秒用六个线程调用该函数,因此每10毫秒处理一次该函数。即使我在这里测试了两个线程,它应该以每10毫秒的间隔运行六个线程。
我使函数成为线程安全的。
MAIN.C
pthread so I use thread joinable
W_control类
int main()
{
io_service io;
deadline_timer t(io);
Wheelchaircontrol w(t);
io.run();
std::cout << "Exit" << endl;
}
Tracking_helper是每10毫秒执行一次的功能。
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <iostream>
using namespace std;
using namespace boost::asio;
static const int NUM_THREADS = 6;
struct Detectdirection {
static void* Tracking_helper(void*) {
return nullptr; // take 60ms in threadsafe manner
}
};
class Wheelchaircontrol {
public:
Wheelchaircontrol(deadline_timer &t_) : t(t_) {
d = new Detectdirection();
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
wait();
}
~Wheelchaircontrol() { delete d; }
void timeout(const boost::system::error_code &e) {
for (int t = 0; t < NUM_THREADS; t++) {
usleep(10000); // 10 msec
switch (t) {
case 0:
rc = pthread_create(&thread[t], &attr, d->Tracking_helper, d);
if (rc) {
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
break;
case 1:
rc = pthread_create(&thread[t], &attr, d->Tracking_helper, d);
if (rc) {
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
break;
} // switch (t)
} // for
for (int t = 0; t < NUM_THREADS; t++) {
switch (t) {
case 0:
rc = pthread_join(thread[t], &ret_status);
if (!rc) {
free(ret_status);
gettimeofday(&tp, NULL);
long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;
cout << " time instance from1 " << ms << endl;
}
break;
case 1:
rc = pthread_join(thread[t], &ret_status);
if (!rc) {
free(ret_status);
gettimeofday(&tp, NULL);
long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;
cout << " time instance from2 " << ms << endl;
}
break;
} // switch (t)
} // for
wait();
}
void cancel() { t.cancel(); }
void wait() {
t.expires_from_now(boost::posix_time::milliseconds(1)); // 100msec
t.async_wait(boost::bind(&Wheelchaircontrol::timeout, this, boost::asio::placeholders::error));
}
private:
int rc;
deadline_timer &t;
struct timeval tp;
Detectdirection *d; // for direction
// InterfaceUSB *usb;
pthread_t thread[NUM_THREADS];
pthread_attr_t attr;
void *ret_status;
int distance;
bool imturn;
// myMosq *mq;
// int cnt_mqt;
// ofstream out;
};
但是时间实例不是等间隔的。 有时它们会在同一时间完成。 我喜欢以10毫秒的间隔拍摄全部内容。