Wednesday, August 08, 2007

Time Travel

Many event-driven programs involve state changes that are triggered according to the system clock. You might be coding for:

  • A share market that opens at 10:00am and closes at 4:00pm.

  • An off-peak phone billing rate that starts after 7:00pm.

  • An interest calculation that is run on the last day of every month.

The asio::deadline_timer class lets you handle this easily. For example:
using namespace boost::posix_time;
typedef boost::date_time::c_local_adjustor<ptime> local_adj;

...

asio::deadline_timer timer(io_service);

ptime open_time(second_clock::local_time().date(), hours(10));
timer.expires_at(local_adj::local_to_utc(open_time));
timer.async_wait(open_market);
There's a catch: to test that your timer events work correctly, you have to run your program at the right time of day. It usually isn't practical to sit around all day (or, worse, all year) waiting for the timers to expire.

Time Traits


You may have noticed that the asio::deadline_timer class is actually a typedef:
typedef basic_deadline_timer<boost::posix_time::ptime>
deadline_timer;
where the basic_deadline_timer class template is declared as follows:
template <
typename Time,
typename TimeTraits
= asio::time_traits<Time>,
typename TimerService
= deadline_timer_service<Time, TimeTraits> >
class basic_deadline_timer;
In the context of our problem, the most interesting template parameter is the second one: TimeTraits. An implementation of TimeTraits lets us customise the treatment of the template's Time parameter, and consequently the behaviour of the timer itself.

A TimeTraits class must implement an interface that matches the following:
class TimeTraits
{
public:
// The type used to represent an absolute time, i.e. the same
// as the Time template parameter to basic_deadline_timer.
typedef ... time_type;

// The type used to represent the difference between two
// absolute times.
typedef ... duration_type;

// Returns the current time.
static time_type now();

// Returns a new absolute time resulting from adding the
// duration d to the absolute time t.
static time_type add(time_type t, duration_type d);

// Returns the duration resulting from subtracting t2 from t1.
static duration_type subtract(time_type t1, time_type t2);

// Returns whether t1 is to be treated as less than t2.
static bool less_than(time_type t1, time_type t2);

// Returns a "posix" duration corresponding to the duration d.
static boost::posix_time::time_duration to_posix_duration(
duration_type d);
};
As you can see from the declaration of the basic_deadline_timer class template, Asio provides a default TimeTraits implementation called asio::time_traits<>.

Offsetting Now


To test our timer events at any time of our choosing, we simply need to change the definition of "now" using a custom TimeTraits class.

Since we want to use the same time types as the regular deadline_timer class, we'll start by reusing the default traits implementation:
class offset_time_traits
: public asio::deadline_timer::traits_type
{
};
The value returned by the now() function will be offset from the system clock by a specified duration:
class offset_time_traits
: public asio::deadline_timer::traits_type
{

private:
static duration_type offset_;
};
which is simply added to the system clock:
class offset_time_traits
: public asio::deadline_timer::traits_type
{
public:
static time_type now()
{
return add(asio::deadline_timer::traits_type::now(), offset_);
}


private:
static duration_type offset_;
};
Of course, we will also need to provide a way to set the offset, which can be done by setting an initial value for "now":
class offset_time_traits
: public asio::deadline_timer::traits_type
{
public:
static time_type now()
{
return add(asio::deadline_timer::traits_type::now(), offset_);
}

static void set_now(time_type t)
{
offset_ =
subtract(t, asio::deadline_timer::traits_type::now());
}


private:
static duration_type offset_;
};

Creating a Timer


To use our custom traits type with the basic_deadline_timer template, we simply need to add the following typedef:
typedef asio::basic_deadline_timer<
boost::posix_time::ptime, offset_time_traits> offset_timer;
To see the offset timer in action, let's create a timer to fire precisely at the start of the coming new year. So we don't have to wait until then, we'll set "now" to be just ten seconds prior to midnight:
offset_time_traits::set_now(
boost::posix_time::from_iso_string("20071231T235950"));

offset_timer timer(io_service);
timer.expires_at(
boost::posix_time::from_iso_string("20080101T000000"));
timer.async_wait(handle_timeout);

io_service.run();
When the program is run, it will take just ten seconds to complete.

Jumping Through Time


One feature not supported by the above solution is the ability to change the definition of "now" after the timers have been started. However, if your timer events are spread across a long period of time, then this is likely to be something you would want.

Let's say that the next timer does not expire for several hours, but in an attempt to speed things up we call set_now() to move to just seconds before. The problem with the above traits class is that the existing asynchronous wait operation does not know about the change to "now", and so will continue to run for the remaining hours.

Fortunately, Asio provides a way around this: by customising the to_posix_duration() function in our traits class.

The to_posix_duration() function is normally used to convert from a user-defined duration type to a type that Asio knows about (namely boost::posix_time::time_duration). The key point here is that this converted duration value is used by Asio to determine how long to wait until the timer expires. Furthermore, it doesn't matter if this function returns a duration that is smaller (even substantially so) than the actual duration. The timer won't fire early, because Asio guarantees that it won't expire until the following condition holds true:
!TimeTraits::less_than(Time_Traits::now(), timer.expires_at())
So, by adding the to_posix_duration() function to our traits class:
class offset_time_traits
: public asio::deadline_timer::traits_type
{
public:
static time_type now()
{
return add(asio::deadline_timer::traits_type::now(), offset_);
}

static void set_now(time_type t)
{
offset_ =
subtract(t, asio::deadline_timer::traits_type::now());
}

static boost::posix_time::time_duration to_posix_duration(
duration_type d)
{
return d < boost::posix_time::seconds(5)
? d : boost::posix_time::seconds(5);
}


private:
static duration_type offset_;
};
we can ensure that Asio detects changes to the offset within seconds.

12 comments:

  1. You were great and everyone received so much from your experience and knowledge. Absolutely amazing, thank you for sharing your knowledge. 카지노

    ReplyDelete
  2. I always prefer to read the quality content and this thing I found in you post. 카지노사이트

    ReplyDelete
  3. You’re doing a great job, keep it up doing a great work like this one.
    바카라사이트

    ReplyDelete
  4. Are you still worried about quitting smoking? Try Orcas Pod Kit,Steam Crave RDTA and Artery Starter Kit. There is no secondhand smoke and no impact on health. You can choose the nicotine content according to the schedule and the price is cheap and the quality is guaranteed.
    vapecigas

    ReplyDelete
  5. Amazon’dan Para Kazanmak
    Amazon ve diğer ticaret ortakları arasındaki en büyük fark, pazarın temel iş modeliyle de aynıdır: Amazon, kendi pazarlama ve dağıtım kanallarınız aracılığıyla aracılar aracılığıyla ürünlerinizi alıp satmak yerine, ürünlerinizi anında ve bağımsız olarak devasa boyutlarda sunmanıza olanak tanır. çevrimiçi pazar platformu.

    Yalnızca sınırlı miktarda ürünlerinizi (alabilen) alışılmış ticaret ortaklarınızın aksine, bunları Amazon'da pazarlamak, neredeyse sınırsız bir şekilde ölçeklendirmenize olanak tanır ve bu da en büyük avantajlardan birini sunar. Amazon FBA (Fulfillment by Amazon) veya Amazon VCS (KDV Hesaplama Hizmeti) gibi teslimat ve gönderim hizmeti gibi ek siparişler , uluslararası alanda bile daha sorunsuz bir şekilde genişlemenizi sağlar.

    Bu hizmetlerden yararlanmak için Amazon satıcıları , abonelik seçiminize ve ürün kategorinize bağlı olarak bir ücret öderler . Profesyonel Satıcı hesabı için aylık abonelik size aylık 39 EUR'ya mal olurken, temel bir hesap, birim başına satış oranınıza göre ücretler belirleyecektir, bu da sizin için kesinlikle hiçbir finansal risk olmadığı anlamına gelir.

    Amazon, satın almak isteyen milyonlarca müşteriye anında erişim sağlayan go-to-platformdur
    Kendi online mağazanızın olması da birçok yönden harika bir seçenek ve en büyük avantajı diğer platformlara bağımlı olmamanız. Ancak, mağazanız hala gelişme aşamasındaysa, aynı anda Amazon'da satış yaparken orada satış yapmak son derece karlı olabilir. Bir Amazon satıcısı olarak, mağazanızın web sitesine müşteri çekmek için çok para ve zaman harcamak yerine, pazara zaten bir şeyler satın almak isteyen zaten mevcut bir müşteri tabanına güvenebilirsiniz. Bu şekilde, herhangi bir finansal yük olmadan arka planda kendi çevrimiçi mağazanızı kurarken ve geliştirirken, Amazon'un dünya çapındaki varlığından ve müşterilerinin güveninden doğrudan yararlanırsınız.

    Amazon'da satış yapmanın harika yanı, akıllı mekanizmalarının ürünlerinizi satın almayla son derece ilgilenen alıcılara önermesidir, yeter ki ürün teşhiri, SEO ve müşteri hizmetleri ile ilgili en önemli temel kuralları anlayın ve uygulayın. bu yazıda size anlatacağım. Bu kuralları uygularsanız, ilk maliyetleriniz düşük kalır, dönüşüm oranlarınız fırlar ve satışlarınız büyük ölçüde artmaya çalışır.

    Ve Amazon'un Prime statüsüne hak kazanabilirseniz, pazaryerinin satın alma olasılığı en yüksek olan ve yalnızca Almanya'da 17 milyondan fazla insanı sayan müşteri grubuna anında erişebilirsiniz.


    Ürün bilgileri
    Ürünlerinizi ve incelemelerini optimize ederken temel bilgilerle başlamalısınız. Bu, ürününüzü doğru kategori altında dosyalamanın yanı sıra, doğru ve doğru bir ürün başlığı anlamına gelir. Makaleniz yalnızca onu satın almakla ilgilenen kişiler tarafından bulunmalıdır. Bu aynı zamanda bilgilendirici ve yüksek kaliteli ürün resimleri ve makale açıklamaları gerektirir. Ayrıca, Özellik Metni alanındaki makale açıklamasını özetlemeli ve araştırmanızı yaptıktan sonra mümkün olduğunca çok sayıda alakalı anahtar kelime ile paketlemelisiniz. Bu, ürün sayfanızın bilgi miktarını artırır ve potansiyel alıcıların ürünlerinizi bulmasını sağlar.

    Ek arama terimleri (her biri 50 karakterden oluşan 5 alan) tanımlamanın yanı sıra ürün markasının makale açıklamasının ilgili alanına eklenmesi makalelerinizi keşfetmenizi kolaylaştırabilir. Varyantları birbirine bağlamak bir diğer önemli husustur: Amazon'da ürün satarak para kazanmak istiyorsanız ve ürünleriniz farklı renklerde, boyutlarda veya bellek alanlarında geliyorsa, örneğin bunları tek bir ana üründe kataloglayabilirsiniz (Ana Ürün olarak adlandırılır). DE OLDUĞU GİBİ). Müşteri, ürününüzü aynı ürün sayfasında seçebilecekleri çeşitli varyantları ile görecek ve bu da hem işlerini kolaylaştıracak hem de satın alma şanslarını artıracaktır.

    ReplyDelete
  6. Executive-Education.id is surely an association that gives confidential tutoring software products and services around Jabodetabek. The non-public teaching plan here's defined by assistance ... go to https://privat-jabodetabek.netlify.app/les-privat-pasar-rebo.html for further

    ReplyDelete
  7. Jabodetabek private tutoring services with teachers coming to the house. Above countless active tutors are ready to teach various skills and lessons for youngsters to adults ... click https://privatmurah.vercel.app/les-privat-kemayoran-murah.html for more information

    ReplyDelete
  8. very nice article thanks for sharing kiyarash

    ReplyDelete
  9. Time travel continues to fascinate our imagination, fueling countless works of fiction and inspiring scientific inquiry. While the current scientific understanding suggests theoretical possibilities, achieving practical time travel remains a subject of ongoing exploration CheapOair Discount Code.

    ReplyDelete
  10. This is a rundown of basic hard abilities a designer ought to have. Search for such skills in CVs or expert work media stages like LinkedIn. Likewise, up-and-comers ought to share a connection to GitHub so a specialized expert can survey their instances of finished projects and assess their functioning experience.

    Other than hard abilities, an independent Ruby on Rails designer ought to have a vigorous arrangement of delicate abilities. Experts who can't deal with their functioning time and convey obviously will not be that huge of an assistance>> ruby on rails freelance developer

    ReplyDelete
  11. Time travel has always been a captivating concept, but when it comes to our real-world adventures, ensuring we're prepared for unexpected twists is crucial. That's where travel insurance from traveldefend.com steps in, providing peace of mind for every journey. Explore the past and future with confidence!

    ReplyDelete