2011-01-16 14 views
28

में कैसे एकीकृत कर सकता हूं, मैं वर्तमान में पहली बार कुछ सरल टीसीपी नेटवर्किंग के लिए boost :: asio का उपयोग करने की कोशिश कर रहा हूं, और मैं पहले से ही कुछ आया है, मुझे सच में यकीन नहीं है कि कैसे निपटना है। जहां तक ​​मैं समझता हूं कि io_service.run() विधि मूल रूप से एक लूप होता है जो तब तक चलता है जब तक कि कुछ और करने के लिए बाएं नहीं होता है, जिसका अर्थ है कि यह तब तक चलता रहेगा जब तक कि मैं अपना छोटा सर्वर ऑब्जेक्ट जारी नहीं करता। चूंकि मुझे पहले से ही कुछ प्रकार का मेनलोप सेट अप मिला है, इसलिए मैं सादगी के लिए मैन्युअल रूप से नेटवर्किंग लूप को मैन्युअल रूप से अपडेट करना चाहता हूं, और मुझे लगता है कि io_service.poll() जो मैं चाहता हूं वह करूंगा, इस प्रकार की तरह:बूस्ट :: Asio: io_service.run() बनाम पोल() या मैं बूस्ट :: एएसओ को मुख्यलोप

void myApplication::update() 
{ 
    myIoService.poll(); 
    //do other stuff 
} 

ऐसा लगता है, लेकिन मुझे अभी भी आश्चर्य है कि इस विधि से कोई कमी है क्योंकि यह boost :: asios io सेवाओं से निपटने का सामान्य तरीका प्रतीत नहीं होता है। क्या यह एक वैध दृष्टिकोण है या मुझे एक गैर अवरोधक अतिरिक्त थ्रेड में io_service.run() का उपयोग करना चाहिए?

उत्तर

37

के बजाय io_service::poll का उपयोग करना पूरी तरह से स्वीकार्य है। अंतर documentation

चुनाव() फ़ंक्शन में समझाया गया है भी किया जा सकता है तैयार संचालकों प्रेषण करने के लिए, लेकिन को रोके बिना।

ध्यान दें कि io_service::run अगर कोई work कतार

में छोड़ दिया है काम वर्ग io_service सूचित करने के लिए प्रयोग किया जाता है को अवरुद्ध कर देगा जब काम शुरू होता है और खत्म। यह सुनिश्चित करता है कि io_service ऑब्जेक्ट का रन() फ़ंक्शन कार्य चल रहा है, जबकि से बाहर नहीं निकलता है और यह अधूरा काम शेष होने पर बाहर निकलता है।

जबकि io_service::poll इस व्यवहार को प्रदर्शित नहीं करता है, यह सिर्फ तैयार हैंडलर को आमंत्रित करता है। यह भी ध्यान रखें कि आपको io_service::reset किसी भी बाद के आमंत्रण पर io_service:run या io_service::poll पर आमंत्रित करने की आवश्यकता होगी।

+9

'io_service'' io_service :: poll' लौटने के बाद जरूरी नहीं है। बाद में 'io_service :: run' या 'io_service: poll' से पहले' io_service :: reset' की आवश्यकता क्यों है? – updogliu

2

एक दोष यह है कि आप एक व्यस्त लूप बनायेंगे।

while(true) { 
    myIoService.poll() 
} 

100% सीपीयू का उपयोग करेगा। myIoService.run() 0% सीपीयू का उपयोग करेगा।

myIoService.run_one() जो भी आप चाहते हैं वह कर सकता है लेकिन अगर ऐसा करने के लिए कुछ भी नहीं है तो यह अवरुद्ध होगा।

+2

आप वास्तव में इस सरल मामले में भागना पसंद करेंगे, लेकिन ऐसी परिस्थिति में जहां एक ईवेंट लूप पहले से मौजूद है (कहें कि यह पृष्ठभूमि प्रतिपादन या अतिरिक्त चक्रों में अन्य चीजें कर रहा है) तो चुनाव को प्राथमिकता दी जाएगी क्योंकि आप नहीं चाहते कि खेल रोक रहा है हर बार रन() ब्लॉक। –

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