2016-04-14 15 views
0

Öyleyse deadline_timer sınıfıyla deneme yapıyordum ve farklı zamanlarda yürütecek birden çok async_wait işlemiyle deadline_timer üzerinde olup olmadığımı görmek için aşağıdaki kodu yazdım. Aşağıda, ana işlevde en altta bir son tarih sayacı oluyorum ve başlangıçta 3 saniye sonra sona erecek şekilde ayarlıyorum. Ardından async_wait işlemini çağırıyorum ve işleyici olarak ilk yazdırma işlevini iletiyorum. Daha sonra, bir işleyici olarak print2'ye sahip olan ikinci async_wait çağrısını etkilemeyi planladığım sürenin bitim süresini ayarlamak için expires_from_now işlemini kullanıyorum. Bunu çalıştırmanın çıktısı, kodun altında. Boost :: asio çoklu yürütme sürelerine sahip bir deadline_timer bulundurmak mümkün mü?

Bu

Burada
#include <iostream> 
#include <string> 
#include <boost/asio.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/bind.hpp> 
#include <time.h> 
#include <sys/time.h> 

double get_wall_time(){ 
    struct timeval time; 
    if (gettimeofday(&time,NULL)){ 
     // Handle error 
     return 0; 
    } 
    return (double)time.tv_sec + (double)time.tv_usec * .000001; 

} 
void print(double start, const boost::system::error_code& /*e*/) 
{ 
    std::cout << "Hello, world!" << std::endl; 
    std::cout << get_wall_time() - start << std::endl; 


} 
void print2(double start, const boost::system::error_code& /*e*/) 
{ 
    std::cout << "SECOND Hello, world!" << std::endl; 
    std::cout << get_wall_time() - start << std::endl; 


} 

int main(int argc, char* argv[]) 
{ 
    boost::asio::io_service io; 
    boost::asio::deadline_timer timer(io, boost::posix_time::seconds(3)); 
    auto start = get_wall_time(); 
    timer.async_wait(boost::bind(print, start, boost::asio::placeholders::error)); 
    timer.expires_from_now(boost::posix_time::seconds(20)); 
    timer.async_wait(boost::bind(print2, start, boost::asio::placeholders::error)); 

    io.run(); 
    return 0; 
} 

test1.cpp

olan bu son modifikasyon ile ikinci async_wait üzerinden yorum sonra çıkışı çıkış

Hello, world! 
0.000774145 
SECOND Hello, world! 
20.0085 

olup.

Hello, world! 
3.00079 

Gördüğünüz gibi, ilk işleyici 3 saniye sonra yürütmek istediğimde anında yürütür. İkinci işleyici 20 saniye sonra doğru şekilde yürütülür. Bir grup yaratmak zorunda kalmadan bir deadline_timer ile tasarladığım davranışı elde etmenin herhangi bir yolu var mı?

cevap

1

Bir zamanlayıcının, bir defada yalnızca bir tane async_wait olması gerekir. IIRC, bir başkasını vermek, (hangisi bir hata koduyla işleyiciyi ateşleyecektir) ilkini iptal eder, sanki iptal() ve ardından async_wait().

2 zamanlayıcı etkinliğine yanıt vermek isterseniz, 2 seçeneğiniz vardır. 2 zamanlayıcınız varsa veya zaman aşımını ayarladıktan sonra, ilk işleyiciye ikinci async_wait değerini verin.

+0

Evet, gördüğüm, eklediğiniz her async_wait'in yalnızca "aynı anda" geri kalanla yürütülmesidir. Yapacağım şey, son tarih zamanlayıcılarına paylaşılan_ptrs vektörünü tutmaktır. – vicg

+0

@vicg zamanlayıcılar hareketlidir. Paylaşılan işaretçilere gerek yok. –

+0

Bir zamanlayıcı, beklemede olan birden çok zaman uyum bekletme işlemine sahip olabilir; Ancak, bir zamanlayıcı sadece bir son kullanma süresine sahip olabilir. Son kullanma saatini değiştirmek, zamanlayıcı için tüm sıra dışı async bekleme işlemlerini iptal edecektir. –

İlgili konular