2012-02-20 13 views
5

पर लिख रहा है मैं सॉकेट कनेक्शन में डेटा भेजने के लिए process-send-string का उपयोग कर रहा हूं, लेकिन मैं इस फ़ंक्शन के प्रभाव से संतुष्ट नहीं हूं। असल में, (process-send-string "foo") को कॉल करने से "bar" और फिर "foo" भेजना समाप्त हो सकता है, जैसा कि नीचे बताया गया है। है, जो टाइमर चला सकते हैं, जो बारी में process-send-string कॉल कर सकते हैं, और कोई आदेश इस तरह के नेस्टेड कॉल के बीच लागू की जाती है (यहां तक ​​कि वास्तव में कुछ भी लिखने से पहले)परमाणु रूप से एक सॉकेट

के रूप में Emacs देखरेख से बताया, process-send-string की सी कोड एक समारोह wait_reading_process_output कहता है।

यह यह लगभग असंभव है जो हुक अनियंत्रित समय पर बुलाया द्वारा इस्तेमाल किया जा करने का इरादा है एक RPC प्रोटोकॉल लागू करने में आता है। तो मेरा सवाल यह है कि, हम इस उद्देश्य के लिए आदिम, "सिंक्रनाइज़" लेखन आदिम कैसे प्राप्त कर सकते हैं?

+1

क्या आपने वास्तव में उस प्रभाव का अनुभव किया है? Emacs के स्रोत कोड पर एक नज़र रखने के बाद, ऐसा लगता है कि आपके द्वारा वर्णित मामला तब उत्पन्न हो सकता है जब डेटा को एक बैच में सॉकेट में नहीं लिखा जा सकता है, लेकिन 'sendto' पर एकाधिक कॉल की आवश्यकता होती है। इन कॉलों में से प्रत्येक के बाद, 'wait_reading_process_output' को कीबोर्ड ईवेंट और रीडाइस्प्ले को संभालने के लिए कहा जाता है। यह मुझे स्पष्ट नहीं है कि उस फ़ंक्शन के भीतर उपयोग किए जाने वाले टाइमर फिर से 'प्रक्रिया-प्रेषण-स्ट्रिंग' कह सकते हैं। – Thomas

+0

हां, मैंने निम्नलिखित देखा है: एम 1, एम 2, एम 3 भेजना, कनेक्शन अंत एम 2, एम 3, एम 1 प्राप्त करता है। –

+0

ध्यान दें कि टीसीपी बाइट उन्मुख है, पैकेट उन्मुख नहीं है। यदि एप्लिकेशन "1234" लिखता है, तो टीसीपी स्टैक इसे किसी संभावित विभाजन में भेज सकता है, उदाहरण के लिए "12", "3", "4"। यदि आप टीसीपी के ऊपर एक प्रोटोकॉल चलाने के लिए चाहते हैं, तो आपको अपने संदेशों की सीमाओं को खोजने के लिए एक तरीका निर्धारित करना होगा, उदाहरण के लिए। एक लंबाई क्षेत्र का उपयोग करके। – bew

उत्तर

1

अंत में, मेरे लिए काम करने वाला एक विकल्प लेनदेन कतार API का उपयोग करना था, जो उच्च स्तर है (इसलिए यह प्रोटोकॉल के सभी प्रकारों को संभाल नहीं सकता है), लेकिन वैकल्पिक संदेशों के सही क्रम को सुनिश्चित करता है।

2

बल्कि अपने हुक में सीधे प्रक्रिया: भेजें स्ट्रिंग का उपयोग करने से, एक बफर को संलग्न है, तो प्रक्रिया: भेजें स्ट्रिंग कॉल एक तरीका है कि अतुल्यकालिक नहीं है में चलाने की है।

+1

"क्या प्रक्रिया-प्रेषण-स्ट्रिंग कॉल ऐसे तरीके से चलती है जो असीमित नहीं है" कैसे? –

3

आप की तरह कुछ कर सकता है:

(defun my-send-cmd (proc str) 
    (if (process-get proc 'my-waiting) 
     (process-put proc 'my-pending (append (process-get proc 'my-pending) (list str))) 
    (process-put proc 'my-waiting t) 
    (process-send-string proc str))) 

तो इस प्रक्रिया को फिल्टर में, जब आप एक आदेश का जवाब मिलता है, जाँच `मेरी-लंबित 'और यदि गैर शून्य, पहले आर्ग लेते हैं, इसे प्रक्रिया में भेजें, अन्यथा मेरा इंतजार वापस शून्य पर सेट करें। बेशक, यह मानता है कि प्रत्येक आदेश को सर्वर से उत्तर मिलेगा, और आप आदेशों को स्ट्रीम नहीं कर सकते हैं।

यह कहा व्यवहार आप देख शायद एक बग रूप में गिना जाए, या कम से कम एक misfeature के रूप में है, तो एम एक्स रिपोर्ट-Emacs-बग के साथ रिपोर्ट करें।

+0

यह काम करने लगता है: प्रोटोकॉल संचार अभी भी काम करता है और मैं अब एक संदेश स्वैप (परिणाम) का निरीक्षण नहीं कर सकता, इसलिए मुझे लगता है कि आपने रिलीज से घंटे पर इस प्रमुख मुद्दे को हल करके अपना जीवन बचाया :-) –

+0

विचार "थ्रेड भेजने" के रूप में प्रक्रिया-फ़िल्टर का उपयोग करना मैं जो खो रहा था, और यहां पर अच्छा काम करता है क्योंकि मेरे पास हमेशा वैकल्पिक संदेश होते हैं। –

+0

और एक बग रिपोर्ट के बारे में, मैंने एक भेजा, कुछ छोटी प्रतिक्रिया मिली, लेकिन मुझे अभी भी यह सुनिश्चित नहीं है कि इसे एक बग, गलतफहमी या कोई नहीं माना जाता है। मैं एक स्पष्ट उत्तर प्राप्त करना सुनिश्चित कर दूंगा। –

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