2012-08-01 15 views
5

एसटीएल का उपयोग करके कार्यान्वित टाइमरकॉलबैक पुस्तकालय हैं। मैं अपनी परियोजना में बूस्ट निर्भरता नहीं ला सकता हूं।टाइमरकॉलबैक फ़ंक्शन मानक टेम्पलेट लिब्ररी पर आधारित बूस्ट

समाप्ति पर टाइमर पंजीकृत फ़ंक्शन को कॉलबैक करने में सक्षम होना चाहिए।

+1

आईएमओ, लाइब्रेरी लाने के बजाए, आप अपना खुद का टाइमर जल्दी और साफ लिखने में सक्षम हो सकते हैं। एक नया धागा स्पॉन करें, बार-बार अपने फ़ंक्शन को कॉल करें और फिर कुछ समय के लिए थ्रेड नींद लें। – SuperSaiyan

उत्तर

8

वहाँ मानक पुस्तकालय में कोई विशेष घड़ी है, लेकिन यह आसान एक को लागू करने के लिए पर्याप्त है: उपयोग की

#include <thread> 

template <typename Duration, typename Function> 
void timer(Duration const & d, Function const & f) 
{ 
    std::thread([d,f](){ 
     std::this_thread::sleep_for(d); 
     f(); 
    }).detach(); 
} 

उदाहरण:

#include <chrono> 
#include <iostream> 

void hello() {std::cout << "Hello!\n";} 

int main() 
{ 
    timer(std::chrono::seconds(5), &hello); 
    std::cout << "Launched\n"; 
    std::this_thread::sleep_for(std::chrono::seconds(10)); 
} 

खबरदार कि समारोह एक और धागा पर शुरू हो जाती है, तो सुनिश्चित करें कि इसका उपयोग करने वाले किसी भी डेटा को उचित रूप से संरक्षित किया गया है।

+0

अच्छा समाधान आपको धन्यवाद, हालांकि, यह केवल 'क्लैंग' में काम करता है, जी ++ 4.8.2 कहता है 'त्रुटि: फ़ील्ड' टाइमर (कॉन्स अवधि और, कॉन्स फ़ंक्शन और) [अवधि = std :: chrono :: अवधि के साथ; फंक्शन = शून्य()] :: __ lambda0 :: __ f 'अमान्य रूप से घोषित फ़ंक्शन प्रकार'। कोई विचार? – Avio

+0

@Avio: एक सूचक प्रकार में रूपांतरण को मजबूर करने के लिए, 'हैलो' पर तर्क बदलें। (मुझे यकीन नहीं है कि क्लैंग या जीसीसी सही तरीके से इस प्रकार को कम कर रहा है, लेकिन इससे आपको जो करना चाहिए वह करना चाहिए)। –