2010-03-24 17 views
17

मैं जिस एप्लिकेशन को लिख रहा हूं वह एक लम्बाई एल्गोरिदम करता है जो आमतौर पर समाप्त होने में कुछ मिनट लगते हैं। इस समय के दौरान मैं उपयोगकर्ता को एक प्रगति पट्टी दिखाना चाहता हूं जो इंगित करता है कि जितना संभव हो सके एल्गोरिदम कितना किया जाता है।प्रगति बार डिजाइन पैटर्न?

एल्गोरिदम कई चरणों में विभाजित है, प्रत्येक अपने विशिष्ट समय के साथ। instance-

  • आरंभीकरण के लिए (500 मिली-सेकंड)
  • पढ़ने आदानों (5 सेकंड)
  • चरण 1 (30 सेकंड)
  • चरण 2 (3 मिनट)
  • लेखन आउटपुट (7 सेकंड)
  • नीचे बंद (10 मिली-सेकंड)

हर कदम आर की स्थापना करके इसकी प्रगति काफी आसानी से रिपोर्ट कर सकते हैं [0 से 150] कहें और उसके मुख्य लूप में पूरा किए गए मान की रिपोर्ट करें।

जो मैंने वर्तमान में स्थापित किया है वह नेस्टेड प्रगति मॉनीटर की एक योजना है जो प्रगति रिपोर्टिंग के एक निश्चित पेड़ का एक प्रकार है।

सभी प्रगति पर नज़र रखता है एक अंतरफलक IProgressMonitor से विरासत:

class IProgressMonitor 
{ 
public: 
    void setRange(int from, int to) = 0; 
    void setValue(int v) = 0; 
}; 

पेड़ की जड़ ProgressMonitor जो वास्तविक जीयूआई इंटरफ़ेस से जुड़ा है है:

class GUIBarProgressMonitor : public IProgressMonitor 
{ 
    GUIBarProgressMonitor(ProgressBarWidget *); 
}; 

पेड़ में किसी भी अन्य नोड मॉनीटर हैं जो माता-पिता की प्रगति के टुकड़े पर नियंत्रण लेते हैं:

class SubProgressMonitor : public IProgressMonitor 
{ 
    SubProgressMonitor(IProgressMonitor *parent, int parentFrom, int parentLength) 
    ... 
}; 

SubProgressMonitor अपने माता-पिता की श्रेणी [parentFrom, parentFrom+parentLength] पर नियंत्रण लेता है।

इस योजना के साथ मैं वैश्विक समय में प्रत्येक चरण के अपेक्षित सापेक्ष हिस्से के अनुसार शीर्ष स्तर की प्रगति को स्थिर रूप से विभाजित करने में सक्षम हूं। प्रत्येक चरण को आगे टुकड़ों आदि में विभाजित किया जा सकता है '

इसका मुख्य नुकसान यह है कि विभाजन स्थैतिक है और रन समय पर खोजे गए चर के अनुसार परिवर्तन करने में दर्दनाक हो जाता है।

तो सवाल: क्या इस मुद्दे को हल करने वाली प्रगति निगरानी के लिए कोई ज्ञात डिज़ाइन पैटर्न हैं?

उत्तर

1

यह एक कठिन समस्या है, हमने पिछले परियोजना में भी इसके साथ संघर्ष किया है।

सबसे अच्छा मैं साथ आ सकता हूं कि प्रत्येक चरण वास्तव में वास्तविक जीवन में कितना समय लेता है, और इसके अनुसार सापेक्ष अंतराल की लंबाई को समायोजित करता है।

हालांकि हम (कम से कम जब तक मैं वहाँ था) कि इस परियोजना में इसे लागू नहीं किया है, तो यह सिर्फ एक सैद्धांतिक विचार :-)

4

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

चूंकि मुझे आपकी समस्या के तकनीकी समाधान की जानकारी नहीं है, मुझे लगता है कि आप उपयोगकर्ता को क्या दिखाते हैं (और आप कितना समय समाधान विकसित करते हैं) कार्यात्मक चिंताओं पर आधारित होना चाहिए: इसका उपयोग कौन कर रहा है? जानकारी कितनी सटीक होनी चाहिए? क्या यह एक संवादात्मक प्रक्रिया है जिसके दौरान वे कोई अन्य काम नहीं कर सकते हैं, या क्या वे इसे पृष्ठभूमि में चलाने दे सकते हैं और वापस आ सकते हैं? क्या कार्य प्रक्रिया जिसके दौरान आपका दीर्घकालिक कार्य समय-संवेदी या मिशन-महत्वपूर्ण होता है?

मुझे खेद है कि मैं वास्तव में आपको वह उत्तर नहीं दे सकता जिसे आप ढूंढ रहे हैं, लेकिन शायद आप जो स्ट्रोक में हासिल करने की कोशिश कर रहे हैं उसके बारे में सोचकर एक अच्छा विचार खो देते हैं। =)

5

उपयोगकर्ता की धारणा एक बहुत ही रोचक दृष्टिकोण है।

Chris Harrison कैसे उपयोगकर्ता मानते समय गुजर प्रगति प्रगति बार द्वारा रिपोर्ट के आधार पर

नोट है कि वरीय प्रदर्शन सूत्र (हालांकि वास्तविक अवधि स्पष्ट रूप से सभी प्रयोगों में समान था) (पर एक पत्र प्रकाशित x + (1-एक्स)/2) जहां x :)

इसलिए एक 0 से 1 तक पैमाने पर वास्तविक प्रगति है, मेरा सुझाव है:

  • इकट्ठा दिए गए कार्य के समय पर कुछ आंकड़े
  • प्रारंभिक माप को मापते हैं और प्रगति पट्टी पर अपनी प्रगति को मापने के लिए इसका उपयोग करते हैं, निराशावादी (उदाहरण के लिए 10-15% का बफर तैयार करें)
  • अंतिम से पहले कार्य (या कुछ पिछले कार्यों, जब तक कि वे नियतात्मक अवधि है के रूप में), सब बाहर क्रम में (प्रगतिशील speedup के साथ) समय में प्रगति बार

मैं जानता हूँ कि पूरा करने के लिए जाना है, कि सही नहीं है, लेकिन अगर उन लगता है यह तेज़ है मैं इसके लिए बस जाऊंगा!

0

आप प्रगति सर्कल के साथ प्रगति पट्टी को बदलने पर विचार कर सकते हैं। यदि कार्य में एन कदम हैं, तो पाई में एन वेजेज बनाएं, और प्रत्येक चरण को प्रगति पट्टी की तरह भरें, क्योंकि वह चरण चलता है।

एक अतिरिक्त चरण के रूप में, शायद प्रत्येक चरण के लिए कुछ पाठ प्रदर्शित किया गया है, इसलिए चरण प्रगति के दौरान उनके पास पढ़ने के लिए कुछ है।

2

एक समग्र प्रगति मॉनिटर बनाएं जो बाल प्रगति मॉनीटर द्वारा सूचित जानकारी के आधार पर स्वचालित रूप से बाल प्रगति डिवीजनों की गणना करता है।बच्चे की प्रगति मॉनीटर को कम से कम "अपेक्षित" चलने वाले समय के माता-पिता को सूचित करना चाहिए। चलने वाले अनुमानित समय के बच्चे मॉनिटर को रनटाइम पैरामीटर के आधार पर अपने संबंधित संचालन द्वारा अद्यतन किया जा सकता है और समग्र प्रगति रिपोर्टिंग तदनुसार और स्वचालित रूप से समायोजित की जाएगी।

कुछ इस तरह ...

class IAggregateProgressMonitor : public IProgressMonitor 
{ 
    void setChildValue(IProgressMonitor *, int v); 
    void setChildEstimatedTime(IProgressMonitor *, int v); 
} 

class AggregateProgressMonitor : public IAggregateProgressMonitor 
{ 
    void setChildValue(IProgressMonitor * child, int v) 
    { 
     int aggregateValue = mapChildValueToAggregateValue(child, v); 
     setValue(aggregateValue); 
    } 

    void setChildEstimatedTime(IProgressMonitor * child, ulong ms) 
    { 
     children[child]->estimatedTime = ms; 
     updateChildProgressRatios(); 
    } 
} 

class SubProgressMonitor : public IProgressMonitor 
{ 
    SubProgressMonitor(IAggregateProgressMonitor *parent, int parentFrom, 
        int parentLength) ... ; 
    void setValue(int v) 
    { 
    parent->setChildValue(this, v); 
    } 

    void setEstimatedRunningTime(ulong ms) 
    { 
    parent->setChildEstimatedTime(this, ms); 
    } 
}; 

तुम भी पहला कदम की प्रेक्षित समय का उपयोग बाद में प्रगति संवाददाताओं को पुन: मैप करने के लिए और अधिक सटीक होना करने के लिए कर सकते हैं।

आपको समेकित प्रोग्रेस मॉनिटर में किसी प्रकार का ऑर्डर करने वाला नक्शा बच्चों से सभी जानकारी ट्रैक करने और गणना करने में सक्षम होने की आवश्यकता होगी।

एक बार पूरा हो जाने पर, आप उपयोगकर्ता को प्रगति प्रदर्शित करने के लिए कुल प्रगति मॉनिटर (ओवरराइडिंग IProgressMonitor विधियों) को बढ़ा सकते हैं।

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