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

 

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

CrossThreadCalls ζήτημα

Îåêßíçóå áðü ôï ìÝëïò mclisme. Τελευταία δημοσίευση από το μέλος Τάσκος Γιώργος στις 08-04-2009, 19:21. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  08-04-2009, 15:17 49964

    CrossThreadCalls ζήτημα

    Γειά χαρά,
    Σε κάποιο application που αναπτύσσω με Visual Basic 2008, χρειάζομαι να γεμίσω ένα listbox/combobox/treeview (κ τα 3 με καλύπτουν, η επιλογή δεν έχει σημασία)  με 5000+ αντικείμενα. Εκτός του ότι η διαδικασία αυτή παγώνει ολόκληρη την φόρμα μου μέχρι να ολοκληρωθεί, θα ήθελα πάρα πολύ να ενημερώνω τον χρήστη σε ποιό στάδιο βρίσκομαι ανά πάσα στιγμή όχι με ένα απλό progressbar αλλά με ένα label που κάθε φορά θα αναφέρει ποιό στοιχείο "επεξεργάζεται" κάθε στιγμή. Χωρίς να γνωρίζω πολλά για multithreading λοιπόν, αποφάσισα να χρησιμοποιήσω ένα backgroundworker. Πλεόν, με το κουμπί που συνήθως εκιννούσα τη διαδικασία, απλά καλώ την RunWorkerAsync method του Backgroundworker και στο DoWork event του Backgroundworker, πλέον έχω τον κώδικα που κάνει την παραπάνω εργασία, περίπου κάπως έτσι αλλά όχι με σταθερά νούμερα:
    For i = 1 To 2000
                ListBox1.Items.Add(i.ToString)
                Label1.Text = "number no " & i.ToString & " is being proccessed"
    Next
     
    Φυσικά στο πρώτο τρέξιμο, έλαβα το ανάμενόμενο μήνυμα << Cross-thread operation not valid: Control 'ListBox1' accessed from a thread other than the thread it was created on. >>, επειδή όμως ήθελα να δω αν θα μπορούσε να δουλέψει έστω και έτσι, προσέθεσα την εντολή:

    CheckForIllegalCrossThreadCalls = False

    ακριβώς πριν μπεί στο βρόχο, οπότε και το πρόγραμμα έτρεξε κανονικά, με τη φορμά να ανταποκρίνεται πλήρως όσο γεμίζει το listbox και ταυτόχρονα να εμφανίζεται στο label σε real-time το στοιχείο που επεξεργάζεται ανά πάσα στιγμή.

    Ερώτηση: Υπάρχει πρόβλημα που έθεσα false την παραπάνω επιλογή? Γιατί τότε μου επιτρέπεται να την απενεργοποιήσω? Αν ναί, ποιός θα ήταν ο απλούστερος τρόπος να ενημερώνω ένα αντικείμενο της φόρμας σε real-time, χρησιμοποιώντας όμως δεδομένα/μεταβλητές που αλλάζουν μέσα στο DoWork event του backgroundworker? Στο documentation διάβασα διάφορα για threads και delegates όμως δεν γνωρίζω καν τι είναι, πόσο μάλλον πως χρησιμοποιούνται.

    Ευχαριστώ!

  •  08-04-2009, 16:46 49968 σε απάντηση της 49964

    Απ: CrossThreadCalls ζήτημα

    Ναι, σαφέστατα υπάρχει πρόβλημα... Υποθέτω δεν δοκίμασες να τρέξεις την εφαρμογή εκτός του debugger ε; Γιατί τότε θα διαπιστώσεις ότι εξακολουθεί να σκάει. Αυτό το property είναι μόνο για debugging σκοπούς. Ο κανόνας ΠΟΤΕ ΔΕΝ ΠΕΙΡΑΖΟΥΜΕ ΤΑ CONTROLS ΑΠΟ ΑΛΛΟ THREAD ΕΚΤΟΣ ΑΥΤΟΥ ΠΟΥ ΔΗΜΙΟΥΡΓΗΘΗΚΑΝ είναι απαράβατος.

    Κοίτα εδώ http://msdn.microsoft.com/en-us/library/waw3xexc.aspx για το πως είναι η σωστή υλοποίηση. Μπορείς να μετατρέψεις μετά το παράδειγμα ώστε να ανταποκρίνεται στη δική σου περίπτωση.


    Vir prudens non contra ventum mingit
  •  08-04-2009, 16:52 49969 σε απάντηση της 49964

    Απ: CrossThreadCalls ζήτημα

    Είναι λάθος να απ ενεργοποιείς αυτό το property για τέτοιες περιπτώσεις νομίζω, γιατι η δουλειά του είναι να εντοπίζει ακριβώς
    αυτό το λάθος που σου πετάει, αν δηλαδή από ένα thread προσπαθείς να κάνεις handle properties κάποιου άλλου thread.
    Αυτό θεωρείται πρόβλημα όταν γίνεται direct γιατί δεν ξέρεις ποτέ και τι θα σκάσει στην εφαρμογή σου. Κυρίως δηλαδή υπάρχει
    για Debuging της εφαρμογής.

    Για να ξεπεράσεις αυτό το πρόβλημα σου και να κάνεις handle τα properties που θέλεις κάποιου άλλου thread θα χρειαστεί να δουλέψεις
    με delegates kai Invoke, InvokeRequired. Αν δεν γνωρίζεις τι κάνουν οι delegates καλό είναι λίγο να τους δεις περισσότερο.

    Δες αυτά:

    http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invoke.aspx

    http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx

    http://msdn.microsoft.com/en-us/library/ms173171(VS.80).aspx

  •  08-04-2009, 16:59 49970 σε απάντηση της 49969

    Απ: CrossThreadCalls ζήτημα

    Μάλιστα... Δεν το είχα δοκιμάσει όντως και κάτι μου έλεγε ότι δεν μπορεί να είναι τόσο απλή η λύση! Να λοιπόν που δεν θα αποφύγω το διάβασμα!
  •  08-04-2009, 19:21 49973 σε απάντηση της 49970

    Απ: CrossThreadCalls ζήτημα

    Ποτέ όμως....
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems