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

 

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

Append.Text() σε RichTextBox....

Îåêßíçóå áðü ôï ìÝëïò Τάσκος Γιώργος. Τελευταία δημοσίευση από το μέλος Τάσκος Γιώργος στις 17-09-2008, 18:55. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  16-09-2008, 19:16 44694

    Append.Text() σε RichTextBox....

    Καλησπέρα,

    Έχω ένα πρόβλημα και δεν μπορώ να το λύσω λίγο καιρό τώρα,
    δεν ξέρω βέβαια αν γίνεται αυτό που θέλω.
    Έχω μία κλάση μει καποιες μεθόδους, οι οποίες καλούνται από ένα BackGroundWorker
    όπου υπάρχει σε μια φόρμα, μαζί με ένα richtextbox. Υπάρχει τρόπος να κάνω Append.Text()
    μέσα από την κλάση όπου γίνονται οι εργασίες, στο richtextbox της φόρμας ανάλογα με την πορεία?

  •  16-09-2008, 21:45 44695 σε απάντηση της 44694

    Απ: Append.Text() σε RichTextBox....

    γεια σου φιλε,

    αν καταλαβα σωστα προσπαθησες να κανεις αλλαγες στο richtexbox αλλα "εφαγες" cross threading error λογου του bgWorker!??

    αν πουμε οτι συναιβει το παραπανω που μοιαζει λογικο να θελεις να κανεις, ακου πως μπορεις να "κοροιδεψεις" το προβλημα αυτο.

    λιγο θεωρεια ομως πριν να καταλαβεις αν δεν γνωριζεις καποια βασικα πραγματακια.

    δεν θελω να προτεινω να κανεις new thread και να το κοντρολαρεις μετα γιατι ειναι πιο "προγραμματιστικα-ορθολογικα" σωστο μεν, πολυ ποιο δυσκολο και χρονοβορο δε και σιγουρα θα σκονταψεις και σε αλλα thread errors αργοτερα.(αυτο για να μην πεις οτι δε σε ενημερωσα :)

    ο bgw ειναι η καλητερη και ευκολοτερη λυση για νεα threads oxi παρα πολυ απαιτητικα αλλα να θυμασε οτι το thread που κανει ειναι asynchronous! με απλα λογια το οτι τελειωσε την δουλεια που εκανε αν η εφαρμογη τρεχει δεν σημαινει οτι τερματιστηκε και το thread αυτο αρα ΑΝ πας στο Καπάκι να εκτελεσεις το ιδιο bgw θα σου πει, "μεγαλε δεν μπορω γιατι εκτελουμε ήδη, ή παρομειο μηνυμα"

    ακομα φανταζομαι θα καταλαβες απο το error οτι καθε Αντικειμενο που φτιαχτηκε σε μια Φορμα η φορμα και ολα της τα αντικειμενα ανηκουν σε ΕΝΑ thread και ΔΕΝ μπορεις (οχι ευκολα) να προκαλεσεις αλλαγες σε ενα απο αυτα τα αντικειμενα απο ενα Αλλο thread!

    εσυ τωρα κανεις μια δουλεια σε bgw (ας το βαφτισουμε thread A)
    και προσπαθεις να ενημερωσεις ενα richtxtbox σε μια φορμα που ειναι κοματι αλλου thread (ας το βαφτισουμε Β)
    A cant update-controls from B

    Solution (100% working δοκιμασμενο απειρες φορες απο τον ιδιο)

    to bgw καταρχας απο τα properties καντο
    BackgroundWorker1.WorkerReportsProgress = True
    BackgroundWorker1.WorkerSupportsCancellation = True

    μετα στο event DOWORK εσυ θα γραψει μονο το ακολουθο

    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    BackgroundWorker1.ReportProgress(+1)
    End Sub

    --------------------------------

    μετα να πας στο event tou to ProgressChanged και εκει να γραψεις η να καλεσεις ΟΤΙ θελεις και να κανεις Απο εκει μονο τα update στο RichtxtBox που θες η κανενα progress barr.performstep και γενικα οτι θελεις οπως θα το εγραφες κανονικα σε αλλο σημειο της φορμας ΚΑΙ ΔΕΝ θα φας Κανενα error για crossthreading (να το κανεις οκ)

    example:
    Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged

    Me.Text = "i am updating other thread controls"
    Me.RichTextBox1.AppendText("blablablabla")
    Call myfanction blablabla
    End Sub

    απλα ΠΡΙΝ ξεκινησεις το bgw ας πουμε απο το κουμπι σου βεβαιοσου οτι κανεις Εναν ελεγχο οτι το bgw DEN εχει CancelationPending or IsinUse αν ειναι απλα Καντο ενα bgw.dispose να το σκοτωσεις στα σιγουρα και στο καπακι μπορεις να το ξανακαλεσεις και να μην σου πει οτι χρισημοποιητε!
    Αλλιος ΜΟΝΟ αν τερματιστη η εφαρμωγη σκοτωνοντε τo thread!!!

    α κατι ακομα αν θες να κανεις καποιο στυλ loop απλα vaze ena bgw.reportprogress(+1) kai mesa sto progresschanged to bgw mporeis na enimeroneis tin proodo sta control sou.

    ελπιζω να ημουν σαφεις συγνωμη για το long post ;-)



    p.s πως μπορουμε να γραψουμε κωδικα εδω με φορματ κωδικα? [code] να ειναι λιγο ποιο ομορφο το κειμενο?

    p.s 2 χιλια συγνωμη για τα λαθη, θα διωρθωθει...
    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  16-09-2008, 23:06 44701 σε απάντηση της 44695

    Απ: Append.Text() σε RichTextBox....

    Στο είπε κι ο pkefal, να στο πω κι εγώ. Είναι αδύνατον να διαβάσει κανείς αυτά που γράφεις. Ανάκατα μικρά-κεφαλαία, χωρίς να χωρίζεις προτάσεις.

    Σε παρακαλώ πρόσεξε και το τί ("το thread που κάνει είναι asynchronous") αλλά και το πως το γράφεις αν θέλεις να σε καταλάβει κανείς.

    Όσον αφορά όσα έγραψες: Δεν υπάρχουν σύγχρονα και ασύγχρονα threads. Υπάρχει όμως κανόνας από καταβολής Windows ότι δεν μπορεί ένα thread να πειράξει controls που δημιουργήθηκαν από άλλο thread. Έτσι το thread που χρησιμοποιεί ο BackgroundWorker δεν μπορεί να πειράξει απευθείας τα controls της φόρμας, καθώς αυτά έχουν δημιουργηθεί από το κυρίως thread της εφαρμογής. Μπορούμε όμως να σηκώσουμε το ProgressChanged event και στον handler του να χειριστούμε τα δεδομένα που στέλνει.

    Και για το formatted code .... ήδη υπάρχει στο toolbar. Κάτω δεξιά, τρίτο από το τέλος.




    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  16-09-2008, 23:35 44702 σε απάντηση της 44701

    Απ: Append.Text() σε RichTextBox....

    το ιδιο πραγμα λεμε αγαπητε,

    αλλα thread υπαρχουν (αποκαλουντε καλυτερα) ασυχρονα και συχρονισμενα το εχω διαβασει το εχω δοκιμασει.http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=73

    λυπαμε αλλα δεν μπορω να βρω αυτο που λες για τo [code] το μονο που βλεπω οταν κανω απαντηση ειναι το "επιλογη ετικετων" αυτο?
    toolbar δεν βλεπω! 8-(


    υ.γ
    δεν μπορω να γραφω ελληνικα δεν εχω συνηθησει και πολλες φορες οπως πριν μπορει να μην ειναι ευκολα στην κατανοηση αλλα αυτο δεν σημαινει οτι δεν ειναι σωστα ;-)

    επισης αν ειναι να κανει καποιος παρατηρησεις καποιον για ασχετα θεματα με το αντικειμενο , δεν θα ηταν καλο να το κανει private!? (oxi oti exeis adiko ;-)

    tnx
    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  17-09-2008, 10:48 44709 σε απάντηση της 44695

    Απ: Append.Text() σε RichTextBox....

    Νομίζω κατάλαβα,

    Στην ουσία θα βγάλω απο το DoWork τις εργασίες και θα τις βάλω στο ProgressChanged function,
    προσθέτοντας τα Append.Text() μου ανάμεσα στις εργασίες.

    Θα σκοτώνω το Thread με Dispose πριν το ξεκινήσω εκ του ασφαλούς, και όταν τελειώνει.

    Ευχαριστώ πολυ, θα το δοκιμάσω σύντομα.

  •  17-09-2008, 11:23 44711 σε απάντηση της 44709

    Απ: Append.Text() σε RichTextBox....

    gtas:
    Νομίζω κατάλαβα,

    Στην ουσία θα βγάλω απο το DoWork τις εργασίες και θα τις βάλω στο ProgressChanged function,
    προσθέτοντας τα Append.Text() μου ανάμεσα στις εργασίες.

    Θα σκοτώνω το Thread με Dispose πριν το ξεκινήσω εκ του ασφαλούς, και όταν τελειώνει.

    Ευχαριστώ πολυ, θα το δοκιμάσω σύντομα.


    Σωστά καταλαβες!

    Δεν κάνει τίποτα, χαρά μας να μοιραζόμαστε Knowhow :-)

    αλλά τώρα έχω κι εγώ μια απορία, πως μπορώ να κάνω αυτό το bgw thread να εκμεταλλεύεται το 100% των 4Πυρήνων μου της CPU?

    το καλύτερο που έχω επιτύχει είναι να κάνω το thread High Prioriy , αλλά πάλι οι πυρήνες δεν ξεπερνούν το 50-55%, εγώ δεν θέλω να κάνω τίποτα άλλο στο μηχάνημα εκείνη την στιγμή παρά να δώσω ότι έχω από hardware και να κερδίσω πολλά λεπτά σε επεξεργασία.

    καταλαβαίνω ότι default έτσι πρέπει να δουλεύουν, αλλά έχω δει και custom εφαρμογή που χτυπά 99% cpu και τελειώνει γρηγορότερα! δυστυχώς δεν βρήκα κώδικα σε vb.net για να δω πως το κάνει...

    έχει κανείς καμιά ιδέα?

    ευχαριστώ.

    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  17-09-2008, 13:45 44716 σε απάντηση της 44711

    Απ: Append.Text() σε RichTextBox....

    Το πρόβλημα Cross-Threading λύθηκε με αυτό τον τρόπο.

    Προσθέτοντας αυτη την function και την παρακάτω delegate, χρησιμοποιώντας .InvokeRequired για να καταλάβει το thread
    ότι πρέπει να γυρίσει στο thread της φόρμας εφόσον εκεί ανήκει το Control.

    Και χρησιμοποιώντας AddMessage("blablabla"); φυσικά!. Δουλευει like a charm ;)

            delegate void newMessage(string txt);
           
            void AddMessage(string txt)
            {
                if (richTextBox1.InvokeRequired)
                {
                    newMessage d = new newMessage(AddMessage);
                    this.Invoke(d, new object[] { txt });
                }
                else
                {
                    richTextBox1.AppendText(txt);
                    richTextBox1.ScrollToCaret();
                }
            }


    Σας ευχαριστώ και τους δύο.

  •  17-09-2008, 17:17 44718 σε απάντηση της 44716

    Confused [*-)] Απ: Append.Text() σε RichTextBox....

    αυτος ειναι ο "ορθολογικος" τροπος που ελεγα αλλα ποιο συνθετος...

    για ενα απλο richtextbox μπορει να τον διαλεγα αλλα αν θελω να κανω ποιο πολλα controls update και μαλιστα αν ειναι διαφορετικα? πρεπει να γραφω ενα function για καθε control!?

    παντος σε ευχαριστω που το μοιραστικες μαζι μας ομολογω οτι ειναι απο τους ποιο καλογραμμενους που εχω δει και συντομος.

    ελπιζω να εχει καποιος και καμια ιδεα πως να κανεις ενα thread να εκμεταλευεται την cpu σου στο 100%....?
    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  17-09-2008, 18:55 44721 σε απάντηση της 44718

    Απ: Append.Text() σε RichTextBox....

    Όντως το πρόβλημα είναι μεγάλο αν έχεις πολλά Controls στην συγκεκριμένη λύση.

    Αλλά για την παρούσα στιγμή και χωρίς να έχω ιδέα απο Threads βόλεψε τζάμι ;).
    Με υπομονή και πολύ δουλειά θα φτάσουμε και σε αυτό το επίπεδο.


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