Ö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ı?
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
@vicg zamanlayıcılar hareketlidir. Paylaşılan işaretçilere gerek yok. –
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. –