Khi bạn gọi expires_from_now()
trên bộ hẹn giờ đang chạy, bộ hẹn giờ bị hủy và bộ hẹn giờ mới được gọi. Vì vậy, trình xử lý liên quan được gọi. Dễ phân biệt đối xử trong bộ xử lý giữa bộ hẹn giờ đã hủy và hết hạn. Tuy nhiên, tôi tự hỏi, nếu có một cách để phân biệt đối xử giữa một bộ đếm thời gian đã hết hạn và được truy xuất lại. Trong cả hai trường hợp, trình xử lý được gọi là với error_code operation_aborted
. Hoặc có thể tôi thiếu một số chi tiết.Làm thế nào để bạn phân biệt đối xử bị hủy khỏi deadline_timer tăng
Đoạn code dưới đây tạo ra kết quả như sau:
20120415 21:32:28079507 Main: Timer1 set to 15 s.
20120415 21:32:28079798 Main: Timer1 set to 12 s.
20120415 21:32:28079916 Handler1: Timer 1 was cancelled or retriggered.
20120415 21:32:40079860 Handler1: expired.
Điều này cho thấy rằng xử lý là không thể thực hiện hành động cho một handler hủy bỏ, vì retriggering một bộ đếm thời gian sẽ gọi xử lý tương tự và do đó thực hiện tương tự hành động. Đó có lẽ không phải là hành vi dự định.
#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/posix_time/posix_time_io.hpp>
#include <iostream>
using namespace boost::posix_time;
using namespace std;
void handler1(const boost::system::error_code &ec)
{
if (ec == boost::asio::error::operation_aborted)
{
cout << microsec_clock::local_time() << " Handler1: Timer was cancelled or retriggered." << endl;
}
else
{
cout << microsec_clock::local_time() << " Handler1: Timer expired." << endl;
}
}
boost::asio::io_service io_service1;
void run1()
{
io_service1.run();
}
int main()
{
time_facet *facet = new time_facet("%Y%m%d %H:%M:%S%f");
cout.imbue(locale(cout.getloc(), facet));
boost::asio::deadline_timer timer1(io_service1, seconds(15));
timer1.async_wait(handler1);
cout << microsec_clock::local_time() << " Main: Timer1 set to 15 s." << endl;
// now actually run the timer
boost::thread thread1(run1);
timer1.expires_from_now(seconds(12));
cout << microsec_clock::local_time() << " Main: Timer1 set to 12 s." << endl;
// here the timer is running, but we need to reset the deadline
timer1.async_wait(handler1);
thread1.join(); // wait for thread1 to terminate
}
Xin vui lòng, cho chúng tôi biết những gì bạn muốn đạt được. Bức tranh lớn hơn là gì? –
Tôi đang cố gắng triển khai một số trì hoãn bật do sự kiện kích hoạt. Tôi có thể thực hiện độ trễ bật lên cơ bản mà không cần kích hoạt lại. Nhưng nếu bạn chấp nhận biến hoặc thay đổi thời gian trì hoãn, tôi sẽ phải thu hồi nó. –
Và tại sao không làm gì cả, khi bạn nhận được operation_aborted, hãy nhớ một handler cho trước và thiết lập lại nó? –