Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Progress Bar

Îåêßíçóå áðü ôï ìÝëïò Saber. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 28-01-2007, 21:02. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  09-11-2006, 16:56 20110

    Progress Bar

    Γειά σας,

    Στην εφαρμογή που ασχολούμαι τον τελευταίο καιρό, κάποια στιγμή χρειάζονται να γίνουν κάποιοι υπολογισμοί.

    Την ώρα που γίνονται οι υπολογισμοί, δεν κάνω τίποτα στη φόρμα, δηλαδή δεν πειράζω κανένα κουμπί.

    Κα8ώς κοίταζα τα Windows Forms Components, το μάτι μου έπεσε πάνω στην Progress Bar. Ξέρει κανείς πως χρησιμοποιείτε?
    Ας πούμε να αρχίζει να γεμίζει όταν αρχίζουν οι υπολογισμοί και να σταματάει όταν παραχθεί αποτέλεσμα.

    Επίσης για να μην μπορεί κάποιος χρήστης να πειράξει την εφαρμογή, σκέφτομαι να βάλω ένα flag όταν αρχίζουν οι υπολογισμοί και να γίνετε false όταν σταματάνε. Όσο το flag είναι true, τα πεδία και τα κουμπιά στη φόρμα θα είναι Visible:False.

    Το αναπτύσσω σε Visual C# 2005 ES.

    Ευχαριστώ προκαταβολικά...

    I want RAM...to live my life alone
    I want RAM...leave me be
    I want RAM...to do things on my own
    I want RAM...to live my life and to be free
  •  09-11-2006, 17:12 20112 σε απάντηση της 20110

    Απ: Progress Bar

    http://www.dynamicdrive.com/dynamicindex11/xpprogressbar.htm

    Δεν το έχω τσεκάρει, αλλα κοίταξε το μια. Θυμόμουν τι είχε κάνει μια φίλη μου σε μια εφαρμογή και ζήτησα το src. Νομίζω έχει και για .ΝΕΤ. Κοίταξε και πες μας.
    https://twitter.com/biboudis
  •  10-11-2006, 09:02 20130 σε απάντηση της 20112

    Απ: Progress Bar

    Ρίξε αν θέλεις μιά ματιά στο ( http://www.codeproject.com/cs/miscctrl/StatBarProgressPanel.asp)
    Είναι ένα status bar progress bar control .
    Και αντίστοιχα στο ( http://www.codeproject.com/cs/miscctrl/AdvancedProgressBar.asp )
    ένα πιο διαμορφώσιμο progress bar

  •  26-01-2007, 02:08 24075 σε απάντηση της 20110

    Απ: Progress Bar

    Κάτι τέτοιο μπορείς να κάνεις όταν γνωρίζεις το πλήθος των πράξεων που θα εκτελεστούν. Το Progress Bar έχει τις ιδιότητες Min, Max και Value που σε ενδιαφέρουν. Κάθε φορά που θα εκτελείται μία πράξη θα δίνεις στην ιδιότητα Value τιμή ανάλογη με το πλήθος των πράξεων που έχουν εκτελεστεί.

    Π.χ. αν έχεις ένα βρόγχο For-Next που καλείται C φορές
    For I = 1 to C
       ...
       (Πράξεις)
      ...
      PB.Value = ( I / C ) * (PB.Max - PB.Min) + PB.Min
    Next

    Ενώ σε επανάληψη με Do-Loop που δεν ξέρεις μετά από πόσα βήματα θα ολοκληρωθεί -φαντάζομαι ότι- δε γίνεται κάτι τέτοιο.

    Μάλλον θα χρειαστεί και κάποιο Refresh μετά από τη γραμμή PB.Value = ... για να γίνει ανανέωση της φόρμας και να εμφανιστεί η νέα τιμή του Progress Bar.

    Edit:
    Τώρα πρόσεξα ότι αναφέρεσαι σε Visual C# 2005 ES. Οι παραπάνω γραμμές αφορούν τη Visual Basic και δε γνωρίζω αν και κατα πόσο υπάρχει συνάφεια μεταξύ αυτών.
  •  26-01-2007, 09:15 24078 σε απάντηση της 24075

    Απ: Progress Bar

    Το καλύτερο που θα μπορούσες να κάνεις, είναι να εκτελέσεις αυτούς τους υπολογισμούς ασύγχρονα. Δηλαδή το κύριο thread της εφαρμογής σου απλά θα δείχνει ένα progress bar να ανανενώνεται ενώ οι υπολογισμοί θα γίνονται σε ένα thread που θα τρέχει παράλληλα. Αν δεν ξέρεις πόσο θα διαρκέσει η διαδικασία υπολογισμού, είτε ποσοτικά πχ έχω να υπολογίσω 1500 αριθμούς, είτε χρονικά πχ διαρκεί 80 δευτερόλεπτα, τότε δεν υπάρχει τρόπος να ξεκινήσεις το progress bar και να γεμίζει παράλληλα με την πρόοδο της διαδικασίας σου. Απλά θα το γεμίσεις και όταν φτάνει στο τέλος θα το αδειάζεις και πάλι από την αρχή. Σε αυτές τις περιπτώσεις, γυρίζουμε το Style propertry του ProgressBar σε "Marquee", ώστε να είναι εμφανές ότι χρησιμοποιείται ως φουρφούρι (δηλαδή για να δείξει ότι το PC κάτι κάνει) και όχι πληροφοριακά για να μας δείξει σε πιο στάδιο της διαδικασίας είμαστε.

    Ρίξε μια ματιά σε αυτό το άρθρο σχετικά με ασύγχρονες διαδικασίες. Είναι σε vb.net αλλά με έναν converter μπορείς να γυρίσεις τα samples σε C#: http://www.dotnetzone.gr/cs/blogs/mkelaiditis/articles/10156.aspx

    Στο Visual Studio 2005 έχουν προσθέσει ένα control που λέγεται BackgroundWorker το οποίο ουσιαστικά υλοποιεί πολλά από αυτά που λέει το άρθρο παραπάνω. Δες εδώ http://msdn2.microsoft.com/en-us/library/b2zk6580(vs.80).aspx πως μπορείς να το χρησιμοποιήσεις σε συνδυασμό με ένα progress bar.


    Vir prudens non contra ventum mingit
  •  27-01-2007, 17:01 24138 σε απάντηση της 24075

    Απ: Progress Bar

    pantelee, δεν χρειάζεται να κάνεις μετατροπές για να θέσεις την τιμή του ProgressBar.Value, αν βάλεις Min=1 και Max=C. Μετά απλά θέτεις ProgressBar.Value=i

    Αντί για Refresh πάντως χρειάζεται το DoEvents. Ο λόγος είναι ότι εφόσον οι υπολογισμοί εκτελούνται στο thread της φόρμας, το UI θα μπλοκάρει μέχρι να τελειώσει ο υπολογισμός. Επειδή όμως η DoEvents είναι ακριβή, καλύτερα να καλείται αραιά, πχ. κάθε 10ο iteration.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  28-01-2007, 18:43 24158 σε απάντηση της 24138

    Απ: Progress Bar

    Παναγιώτης Καναβός:
    Επειδή όμως η DoEvents είναι ακριβή, καλύτερα να καλείται αραιά, πχ. κάθε 10ο iteration.

    Αυτό που λες Παναγιώτη είναι πολύ σωστό από την καθαρά τεχνική άποψη του ζητήματος, αλλά όσον αφορά την ψυχολογία του χρήστη, μπορεί να αξίζει τον κόπο η θυσία της επίδοσης στο βωμό της χρηστικότητας.

    Σε μια διαδικασία όπου οι επαναλήψεις είναι αργές (από δευτερόλεπτο και πάνω), ανανεώνοντας το UI κάθε 10 επαναλήψεις τελειώνεις πιο γρήγορα, αλλά δίνεις στο χρήστη την αίσθηση του αργού, κολλημένου προγράμματος. Αν όμως επωμιστείς το κόστος της DoEvents σε κάθε επανάληψη (ή αν οι επαναλήψεις είναι >5 sec πολλές φορές σε κάθε επανάληψη), τότε ο χρόνος ολοκλήρωσης της διαδικασίας θα είναι μεν μεγαλύτερος, αλλά ο χρήστης δε θα τον έχει αισθανθεί τόσο γιατί βλέπει την εφαρμογή να ανταποκρίνεται. Είναι πολύ σημαντικό να έχει ο χρήστης την εντύπωση ότι έχει τον έλεγχο αυτός και όχι ο υπολογιστής, ακόμα κι αν αυτό κοστίζει στα απόλυτα νούμερα. Ο άνθρωπος σπάνια αντιλαμβάνεται τη διαφορά ανάμεσα στα 60 και τα 80'', ενώ πολύ εύκολα καταλαβαίνει ότι η εφαρμογή δεν ανταποκρίνεται ακαρίαία (<1/10'').

    Νατάσα Μανουσοπούλου
  •  28-01-2007, 21:02 24172 σε απάντηση της 24158

    Απ: Progress Bar

    Εννοείται ότι ανάλογα με το πόσο βαρύ είναι το κάθε iteration θα κάνεις και το αντίστοιχο refresh. Αν είναι βαρύ, δεν υπάρχει πρόβλημα να κάνεις refresh σε κάθε iteration. Κατά κανόνα όμως τα iterations είναι ελαφριά, με αποτέλεσμα τα συχνά DoEvents να προκαλούν μεγαλύτερη καθυστέρηση από το ίδιο το iteration. Είναι θέμα κρίσης του κάθε developer πόσο συχνά θέλει να κάνει update το progress bar.

    Εδώ που τα λέμε, δεν θα ήταν άσχημο ένα progress bar το οποίο θα μπορούσε να διαχειριστεί τόσο iterations όσο και μακροχρόνιες εργασίες, κάτι σαν το progress bar του Internet Explorer. Όταν μία σελίδα αργεί πολύ να κατέβει, το progress bar προχωράει πολύ αργά, αντί να σταματήσει εντελώς περιμένοντας το επόμενο πακέτο.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems