2011-07-24 15 views
6

Learning OpenCV पुस्तक में, मैं callback शब्द पर आया, और कभी-कभी routinecallback routine के रूप में उपयोग किया जाता था।नियमित रूप से कॉल करें

हम क्या कहते हैं जब हम callback कहते हैं?

धन्यवाद।

+1

कॉलबैक हमेशा के लिए मतदान से अधिक सुरुचिपूर्ण तरीका है। यह घटना संचालित प्रोग्रामिंग मॉडल का हिस्सा है। –

उत्तर

5

"मैं इसे अपने आप नहीं कहता, लेकिन सिस्टम (या कुछ अन्य) इसे कॉल करेंगे"। यह कॉलबैक है।

13

कॉलबैक फ़ंक्शन क्या है?
सरल शब्दों में, कॉलबैक फ़ंक्शन एक ऐसा फ़ंक्शन है जिसे प्रोग्रामर द्वारा स्पष्ट रूप से नहीं कहा जाता है। इसके बजाए, कुछ तंत्र है जो लगातार घटनाओं के लिए इंतजार कर रहा है, और यह विशेष घटनाओं के जवाब में चयनित कार्यों को कॉल करेगा।
यह तंत्र आमतौर पर तब उपयोग किया जाता है जब एक ऑपरेशन (फ़ंक्शन) निष्पादन के लिए लंबा समय लेता है और फ़ंक्शन का कॉलर ऑपरेशन पूरा होने तक प्रतीक्षा नहीं करना चाहता, लेकिन ऑपरेशन के नतीजे से सूचित होना चाहता है। आम तौर पर, कॉलबैक फ़ंक्शंस ऐसे एसिंक्रोनस तंत्र को लागू करने में सहायता करते हैं, जिसमें कॉलर रजिस्टर्स समय लेने वाली प्रसंस्करण और निरंतर अन्य परिचालनों के परिणाम के बारे में सूचित होते हैं, जबकि बाद में कॉलर को परिणाम की जानकारी मिलती है।

एक व्यावहारिक उदाहरण:
विंडोज घटना प्रसंस्करण:
लगभग सभी खिड़कियों कार्यक्रमों एक घटना पाश की स्थापना की, कि इस कार्यक्रम (विशेष रूप से घटनाओं का जवाब जैसे बटन प्रेस, एक चेक बॉक्स का चयन, खिड़की हो रही बनाता है फोकस) एक समारोह बुलाकर। आसान बात यह है कि प्रोग्रामर निर्दिष्ट कर सकता है कि कौन सा फ़ंक्शन कॉल किया जाता है जब (कहें) एक विशेष बटन दबाया जाता है, भले ही बटन दबाए जाने पर निर्दिष्ट करना संभव न हो। जिसे कहा जाता है उसे कॉलबैक के रूप में जाना जाता है।

एक स्रोत कोड उदाहरण:

//warning: Mind compiled code, intended to illustrate the mechanism  
#include <map> 

typedef void (*Callback)(); 
std::map<int, Callback> callback_map; 

void RegisterCallback(int event, Callback function) 
{ 
    callback_map[event] = function; 
} 

bool finished = false; 

int GetNextEvent() 
{ 
    static int i = 0; 
    ++i; 
    if (i == 5) finished = false; 
} 

void EventProcessor() 
{ 
    int event; 
    while (!finished) 
    { 
     event = GetNextEvent(); 
     std::map<int, Callback>::const_iterator it = callback_map.find(event); 
     if (it != callback_map.end()) // if a callback is registered for event 
     { 
      Callback function = *it; 
      if (function) 
      { 
       (*function)(); 
      } 
      else 
      { 
       std::cout << "No callback found\n"; 
      } 
     } 
    } 
} 

void Cat() 
{ 
    std::cout << "Cat\n"; 
} 

void Dog() 
{ 
    std::cout << "Dog\n"; 
} 

void Bird() 
{ 
    std::cout << "Bird\n"; 
} 

int main() 
{ 
    RegisterCallBack(1, Cat); 
    RegisterCallback(2, Dog); 
    RegisterCallback(3, Cat); 
    RegisterCallback(4, Bird); 
    RegisterCallback(5, Cat); 

    EventProcessor(); 
    return 0; 
} 

ऊपर होगा उत्पादन निम्नलिखित:

Cat 
Dog 
Cat 
Bird 
Cat 

आशा इस मदद करता है!


नोट:
मेरे पुराने जवाब here में से एक से इस उत्तर आयातित।

+0

फ़ंक्शन पॉइंटर्स = खराब। – Puppy

+2

मैं समझता हूं कि 'मज़ेदार' अच्छे हैं लेकिन मुझे नहीं लगता कि 'फ़ंक्शन पॉइंटर्स' कितने खराब हैं, जब उद्देश्य कॉलबैक को समझना है? –

3

उनका मतलब है कि आप एक प्रक्रिया में OpenCV पर एक पॉइंटर पास करते हैं। कुछ होता है जब यह called back होगा। यह उदाहरण दे सकता है cvSetMouseCallback() पर देखा गया। जब भी माउस चलता है तो पॉइंटर द्वारा संदर्भित फ़ंक्शन को कॉल किया जाएगा।

2

इस संदर्भ में "रूटीन" "फ़ंक्शन" जैसा ही है।शब्द पुरानी भाषाओं (जैसे फोरट्रान) पर वापस चला जाता है जिसने कार्यों के बीच एक अंतर बनाया है, जो मूल्यों को लौटाता है, और (उप) दिनचर्या जो नहीं करता है।

"कॉलबैक" एक ऐसी तकनीक है जहां आप सिस्टम/एपीआई/फ्रेमवर्क में अपने कार्यों में से एक ("रूटीन") को पॉइंटर प्रदान करते हैं और सिस्टम/एपीआई/फ्रेमवर्क इसे ऐसा करने जैसा महसूस करता है। तो एक कॉलबैक दिनचर्या, या बस एक कॉलबैक, एक ऐसा कार्य है जिसका उद्देश्य इस तरह के उपयोग के लिए है।

कड़ाई से ऑब्जेक्ट भाषाओं (जावा की तरह) में वे आम तौर पर श्रोताओं और प्रतिनिधियों का उपयोग करते हैं। कॉलबैक तकनीक, इसके सी ++ रूप में, इसका लाभ यह है कि यह गैर-ऑब्जेक्ट उन्मुख भाषाओं जैसे क्लासिक सी

संपादित करें: माइक्रोसॉफ्ट सी रन-टाइम लाइब्रेरी में, इस तकनीक का उपयोग qsort() फ़ंक्शन के लिए किया जाता है । compare तर्क कॉलबैक दिनचर्या के लिए फ़ंक्शन पॉइंटर है। जब भी दो सरणी तत्वों की तुलना करने की आवश्यकता होती है तो इसे आरटीएल द्वारा बुलाया जाता है। यह एक सामान्य उदाहरण नहीं है 'क्योंकि सभी कॉल compare qsort() कॉल रिटर्न से पहले होती हैं।

Win32 API में, कॉलबैक एक प्रमुख हैं। खिड़की की प्रक्रिया एक प्रमुख उदाहरण है - आप WNDCLASS संरचना में इसके लिए एक सूचक पास करते हैं, सिस्टम प्रक्रिया के रूप में प्रक्रिया को वापस कॉल करता है। इस मामले में, कॉलबैक दिनचर्या को विंडो के पूरे जीवनकाल के लिए RegisterClass() के बाद लंबे समय से बुलाया जाता है।

पॉज़िक्स/यूनिक्स/लिनक्स में, सिग्नल प्रोसेसिंग फ़ंक्शन एक उदाहरण है। संकेत() syscall विवरण देखें।

+0

आपके अच्छे उत्तर के लिए धन्यवाद। क्या आप इसे और अधिक स्पष्ट करने के लिए एक उदाहरण दे सकते हैं? विशेष रूप से बिंदु जब आप कहते हैं: ** "कॉलबैक" एक ऐसी तकनीक है जहां आप सिस्टम/एपीआई/फ्रेमवर्क में अपने कार्यों में से एक ("दिनचर्या") को पॉइंटर प्रदान करते हैं और सिस्टम/एपीआई/फ्रेमवर्क इसे वापस कॉल करेगा ऐसा करने जैसा लगता है। **? धन्यवाद – Simplicity

1

होलीवुड सिद्धांत के बाद "हमें कॉल न करें, हम आपको कॉल करते हैं", एक कॉलबैक किसी फ़ंक्शन का संदर्भ है जो किसी अन्य फ़ंक्शन पर जाता है।

कॉलबैक को उस फ़ंक्शन द्वारा बुलाया जाएगा, उदाहरण के लिए जब डेटा उपलब्ध हो या कुछ प्रोसेसिंग चरणों को करने की आवश्यकता हो।

0

कॉलबैक फ़ंक्शंस फ़ंक्शन हैं जिन्हें कुछ ईवेंट होने के बाद स्वचालित रूप से ऐसे फ़ंक्शंस को बुलाया नहीं जाता है, उदाहरण के लिए "ctrl + c" सिगिनट सिग्नल उत्पन्न करने के बाद स्वचालित रूप से हैंडलर निष्पादित हो जाएगा।

संबंधित मुद्दे