2010-09-16 16 views
13

मैं डब्ल्यूपीएफ में रीयल-टाइम मल्टी-थ्रेडेड एप्लिकेशन का निर्माण कर रहा हूं, लेकिन मुझे यूआई अपडेट करने में कठिनाइयां हैं।डब्ल्यूपीएफ रीयल टाइम मल्टीथ्रेडेड स्टॉक ट्रेडिंग एप्लीकेशन

मेरे पास पृष्ठभूमि कार्यकर्ता धागा है जिसमें तर्क शामिल है जो निर्धारित करता है कि बाजार में कौन से व्यापार भेजना है। जब बाजार में एक वैध व्यापार भेजा जाता है, तो मुझे अपनी मुख्य एप्लिकेशन विंडो में ईवेंट के माध्यम से इन ट्रेडों पर स्टेटस अपडेट प्राप्त होते हैं। मेरे पास अन्य कार्यक्रम हैं जहां मुझे रीयल-टाइम मूल्य अपडेट प्राप्त होते हैं।

इन घटनाओं के माध्यम से, मैं यूआई को ऊपर उठाता हूं। अब ऐसा प्रतीत होता है कि मुझे एप्लिकेशन के माध्यम से इतनी तेजी से घटनाएं मिलती हैं, कि यूआई उन गतियों के साथ नहीं रह सकती है, जिन पर घटनाएं प्राप्त होती हैं - यूआई को धीरे-धीरे अपडेट करने या बिल्कुल नहीं। अनिवार्य रूप से यूआई फ्रीज। सभी घटनाओं को निकाल दिया गया है, यूआई धीरे-धीरे फिर उत्तरदायी हो जाता है। एक बार यह पूरी तरह उत्तरदायी हो जाने पर, यूआई उस डेटा को दिखाता है जिसे मैं उम्मीद कर रहा हूं।

मेरा सवाल यह है कि, मैं वास्तविक समय में अपडेट करने के लिए यूआई कैसे प्राप्त करूं, जैसे ही मुझे घटनाएं मिलती हैं? मैं थोड़ी देर के लिए इसके साथ संघर्ष कर रहा हूं, इसलिए किसी भी मदद की सराहना की जाएगी।

अग्रिम धन्यवाद!

उत्तर

11

कार्यकर्ता थ्रेड होने के बजाय यूआई थ्रेड को अपडेट के माध्यम से अद्यतनों को धक्का देने के बजाय यूआई थ्रेड को समय-समय पर खींचें (या मतदान) पर विचार करें। पुश विधि कई परिस्थितियों में ठीक है लेकिन आपके पास दो प्रमुख नुकसान हैं जो आपके खिलाफ काम कर रहे हैं।

  • एक महंगी marshaling आपरेशन कहीं कि सुरक्षित रूप से यूआई अद्यतन प्रदर्शन करने के लिए एक विधि के निष्पादन स्थानांतरित कर रहा है नहीं है (कम से कम वहाँ होना चाहिए)।
  • कार्यकर्ता धागा यह निर्देशित करता है कि यूआई को कितनी बार अद्यतन करना चाहिए और निहितार्थ से यह कितना काम करना चाहिए। यह संदेश पंप को आसानी से अभिभूत कर सकता है।

मैं एक साझा कतार का उपयोग करने का प्रस्ताव करता हूं जिसमें कार्यकर्ता थ्रेड अद्यतन युक्त डेटा संरचना को एनक्यू करेगा और यूआई थ्रेड इसे हटा देगा और संसाधित करेगा। आपके पास यूआई थ्रेड कतार को रणनीतिक रूप से चुने गए अंतराल पर मतदान कर सकता है ताकि यह कभी भी नीचे नहीं गिर जाए। कतार यूआई संदेश पंप के बजाय बफर के रूप में कार्य करेगी। यह अद्यतन और ईबीबी और प्रवाह की मात्रा के रूप में बढ़ेगा। मैं किस बारे में बात कर रहा हूं उसका एक सरल चित्र यहां दिया गया है।

[Worker-Thread] -> [Queue] -> [UI-Thread] 

मैं पहली बार सरल कतार दृष्टिकोण के साथ शुरू होगा, लेकिन आप एक पाइप लाइन है, जिसमें 3 धागे के अपडेट के प्रवाह में भाग लेने वाले देखते हैं बनाने की अगला तार्किक कदम को यह लग सकता है। कार्यकर्ता धागा अद्यतन को बढ़ाता है और यूआई थ्रेड उन्हें पहले की तरह हटा देता है। लेकिन, मिश्रण में एक नया धागा जोड़ा जा सकता है जो कतार में प्रतीक्षा किए गए अपडेट की संख्या का प्रबंधन करता है और इसे एक प्रबंधित आकार में रखता है। यदि कतार छोटी रहती है तो यह सभी अपडेटों पर अग्रेषित करके ऐसा करेगी, लेकिन सुरक्षित मोड में स्विच हो जाएगी और यदि आप उचित विलय ऑपरेशन को परिभाषित कर सकते हैं तो उन विकल्पों को छोड़ना शुरू कर सकते हैं जिन्हें आप बिना रह सकते हैं या कई में जोड़ सकते हैं। यहां एक सरल चित्र है कि यह पैटर्न कैसे काम कर सकता है।

[Worker-Thread] -> [Queue-1] -> [Pipeline-Thread] -> [Queue-2] -> [UI-Thread] 

फिर से, सरल एक कतार दृष्टिकोण से शुरू करें।यदि आपको अधिक नियंत्रण की आवश्यकता है तो पाइपलाइन पैटर्न पर जाएं। मैंने सफलतापूर्वक दोनों का उपयोग किया है।

+0

शानदार धन्यवाद ब्रायन। वह जवाब है जो मैं ढूंढ रहा था। तो संक्षेप में, उठाए गए ईवेंट को UI को अपडेट करने की अनुमति देने के बजाय, उन्हें कतार दें, एक टाइमर है जो समय-समय पर इन अद्यतनों को कतार से पॉप करता है और UI को अपडेट करता है। इस तरह यूआई को आपके नियंत्रण में अपडेट किया जाता है, और टाइमर अंतराल शायद मेरी आवश्यकताओं के अनुसार समायोजित किया जा सकता है। – c0D3l0g1c

+0

बिल्कुल! जब यूआई कार्यकर्ता धागे की ज़िम्मेदारी को पारित करने के बजाय अपडेट करने के लिए तैयार होता है तो यूआई को निर्देशित करने दें। –

7

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

+0

+1 कोई आम तौर पर उत्तरदायी होने से पहले यूआई थ्रेड प्रति इकाई के लिए अलग-अलग कॉल की सीमित मात्रा में कर सकता है - एक सेट अंतराल पर यूआई सूचियों जैसे तत्वों के थोक अपडेट करने से भी बहुत मदद मिल सकती है ^^ –