से रद्द किए गए भेदभाव को कैसे भेदभाव करते हैं, जब आप चल रहे टाइमर पर expires_from_now()
पर कॉल करते हैं, टाइमर रद्द कर दिया जाता है, और एक नया टाइमर कहा जाता है। तो संबंधित हैंडलर को बुलाया जाता है। रद्द किए गए और समाप्त होने वाले टाइमर के बीच हैंडलर में भेदभाव करना आसान है। फिर भी, मैं सोच रहा हूं कि को समाप्त होने और एक रिट्रिज्ड टाइमर के बीच भेदभाव करने का कोई तरीका है। दोनों उदाहरणों में हैंडलर को त्रुटि_कोड operation_aborted
के साथ कहा जाता है। या शायद मुझे कुछ विवरण याद आ रहे हैं।आप एक रेट्रिज्जर्ड बूस्ट deadline_timer
नीचे कोड निम्न उत्पादन उत्पन्न करता है:
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.
यह पता चलता है कि हैंडलर, क्योंकि एक टाइमर retriggering फोन करेगा ही हैंडलर एक रद्द हैंडलर के लिए कार्यों को लागू करने और इस तरह एक ही निष्पादित करने में सक्षम नहीं है कार्रवाई। जो संभवतः इच्छित व्यवहार नहीं है।
#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
}
कृपया हमें बताएं कि आप क्या हासिल करना चाहते हैं। बड़ी तस्वीर क्या है? –
मैं कुछ घटना-ट्रिगर टर्न-ऑन देरी को लागू करने की कोशिश कर रहा हूं। मैं इसे बिना किसी रीट्रिगर्ज किए मूलभूत टर्न-ऑन देरी को कार्यान्वित कर सकता हूं। लेकिन यदि आप परिवर्तनीय या समय-देरी बदलते हैं, तो मुझे इसे फिर से शुरू करना होगा। –
और जब आप ऑपरेशन_बॉर्ट नहीं करते हैं, तो कुछ भी क्यों नहीं करते हैं, किसी दिए गए हैंडलर को याद रखें और इसे फिर से सेट करें? –