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

 

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

Πρόβλημα με Async σε richTextBox

Îåêßíçóå áðü ôï ìÝëïò AlKiS. Τελευταία δημοσίευση από το μέλος Libra Storm στις 03-03-2012, 02:16. Υπάρχουν 19 απαντήσεις.
Σελίδα 1 από 2 (20 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  23-02-2012, 00:11 69412

    Πρόβλημα με Async σε richTextBox

    Καλησπέρα σε όλους!

    Έχω ένα θεματάκι Async κώδικα σε richTextBox...

    επειδή το rtb αυτό έχει ένα τεράαααστιο κατεβατό σαν κείμενο, και το να του αλλάξω τα χρώματα παίρνει ώρα καμιά φορά (ανάλογα με το όσα permuatations έχει κάνει), είπα για να μην κολλάει το UI να το κάνω σε async αυτό. Δοκίμασα διάφορους τρόπους, αλλά κανείς δεν πέτυχε...... Δοκίμασα όλα τα βήματα σε ένα sub, δοκίμασα χώρια, δοκίμασα διάφορα..

    Το τελευταίο attempt μου είναι το εξής:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
        Private Delegate Sub SetrtbWorkgroupClrCallback(ByVal AppliedClr As Color, ByVal Selctn As Integer)
        Private Sub SetrtbWorkgroupClr(ByVal AppliedClr As Color, ByVal Selctn As Integer)
    
            If rtbWorkgroup.InvokeRequired Then
                Dim d As New SetrtbWorkgroupClrCallback(AddressOf SetrtbWorkgroupClr)
                Invoke(d, New Object() {AppliedClr})
                Invoke(d, New Object() {Selctn})
    
            Else
                rtbWorkgroup.SelectionStart = Selctn
                rtbWorkgroup.SelectionColor = AppliedClr
            End If
    
        End Sub
    
        Private Delegate Sub SetrtbWorkgroupFontCallback(ByVal AppliedFont As Font, ByVal Selctn As Integer)
        Private Sub SetrtbWorkgroupFont(ByVal AppliedFont As Font, ByVal Selctn As Integer)
    
            If rtbWorkgroup.InvokeRequired Then
                Dim d As New SetrtbWorkgroupFontCallback(AddressOf SetrtbWorkgroupFont)
                Invoke(d, New Object() {AppliedFont})
                Invoke(d, New Object() {Selctn})
    
            Else
                rtbWorkgroup.SelectionStart = Selctn
                rtbWorkgroup.SelectionFont = AppliedFont
            End If
    
        End Sub

    αυτό είναι πάνω πάνω.

    και κάπου μέσα στο rtbWorkgroup.TextChanged έχω το εξής:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
                    Await TaskEx.Run(
                    Sub()
    
                        For j = 1 To CombinationsCount
                            SelSrtPermuSamples = rtbWorkgroup.Find(txtLanguage.Lines(66), LstSelPermuSamples, RichTextBoxFinds.None) 'Permuatation Samples:
                            If SelSrtPermuSamples <> -1 Then
                                LstSelPermuSamples = SelSrtPermuSamples + 1
                                SetrtbWorkgroupFont(New Font(rtbWorkgroup.Font, FontStyle.Bold), SelSrtPermuSamples)
                                SetrtbWorkgroupClr(WorkSpaceMainVariablesColours, SelSrtPermuSamples)
    
                            End If
                        Next
                    End Sub)

    Δε γράφω όλο τον κώδικα του κουμπιού γιατί είναι τεράστιο και είναι beside the point.

    Εδώ μου βγάζει το πρόβλημα "Exception has been thrown by the target of an invocation."

    Όταν καλούνται τα  SetrtbWorkgroupFont, SetrtbWorkgroupClr

    Δεν καταλαβαίνω γιατί όμως! Έχω κάνει τα invocations...


  •  23-02-2012, 14:26 69414 σε απάντηση της 69412

    Απ: Πρόβλημα με Async σε richTextBox

    Δεν ξέρω αν φταίει μόνο αυτό αλλά και οι παρακάτω χρειάζονται έλεγχο για InvokeRequired (τον οποίο δεν κάνεις).

    rtbWorkgroup.Find()
    txtLanguage.Lines
    rtbWorkgroup.Font

    Κοίτα να ενώσεις τους ελέγχους σε έναν ώστε να μην γεμίσεις με πολλά μικρά Invoke. 
  •  23-02-2012, 14:51 69415 σε απάντηση της 69414

    Απ: Πρόβλημα με Async σε richTextBox

    δεν ξέρω πως μπορώ να το κάνω σε ένα. μόνο το ένα κάτω απο το άλλο ξέρω, αλλά και πάλι δεν τοχω ξαναδοκιμάσει για να είμαι σίγουρος ότι δουλεύει.


    Πάντως το "rtbWorkgroup.Find()" και το φόντ έχουν μέσα το  rtbWorkgroup, άρα αφού στο invoke γράφω  rtbWorkgroup τότε δεν ισχύει για τα πάντα? 


  •  23-02-2012, 15:26 69416 σε απάντηση της 69415

    Απ: Πρόβλημα με Async σε richTextBox

    To Invoke θα εκτελέσει τον κώδικα που θα του δώσεις στο UI thread. Το Async όμως εκτελεί τον κώδικα σε άλλο, background thread. Οποιαδήποτε κλήση κάνεις προς το textbox μέσα από το async χρειάζεται Invoke. Προφανώς αν γίνει αυτό, αχρηστεύεται το async.

    Υπάρχουν πολλά πράγματα που μπορείς να κάνεις για να επιταχύνεις τον κώδικα, πρωτού χρησιμοποιήσεις async. 
    • Καταρχήν το επαναλαμβανόμενο search, αλλαγή font είναι πάρα πολύ αργό, καθώς για κάθε λέξη πρέπει πρώτα να κάνεις την αναζήτηση, μετά να αλλάξεις τα χρώματα και να αρχίσεις ξανά.
      Καλύτερα να κάνεις όλες τις αναζητήσεις με τη μία και να βγάλεις τα αποτελέσματα σε μία λίστα με τις θέσεις που θέλεις και μετά να χρησιμοποιήσεις τη λίστα για να αλλάξεις τα χρώματα
    • Δημιουργείς συνέχεια νέα αντικείμενα font τα οποία δεν σβήνεις ποτέ. Τα font είναι πολύ ακριβό resource και πρέπει πάντα να διαγράφονται. Επιπλέον, μπορείς να χρησιμοποιήσεις το ίδιο font object πολλές φορές.
    • Η κλήση της Find για κάθε λέξη είναι επίσης πολύ αργή. Αν θέλεις να κάνεις πολλαπλές αναζητήσεις, απλά πάρε κάπου το Text του textbox και κάνε τις αναζητήσεις στο string αυτό αντί για το textbox, π.χ. χρησιμοποιώντας την String.IndexOf
      Ακόμα καλύτερα, μπορείς να χρησιμοποιήσεις την Regex.Matches για να επιστρέψεις όλες τις εμφανίσεις μίας λέξης με μία μόνο κλήση. Αυτό είναι πολύ ταχύτερο από τις επαναλαμβανόμενες κλήσεις στην String.IndexOf.
    • Αν εξακολουθείς να έχεις καθυστερήσεις, μπορείς να χρησιμοποιήσεις ξανά την async για να κάνεις τις αναζητήσεις ασύγχρονα και να βγάλεις τα αποτελέσματα σε μία λίστα. Μόλις ολοκληρωθεί η αναζήτηση περνάς τη λίστα με τις λέξεις στο function που θα αλλάξει τα χρώματα με Invoke.



    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  23-02-2012, 16:13 69418 σε απάντηση της 69416

    Απ: Πρόβλημα με Async σε richTextBox

    Παναγιώτης Καναβός:
    To Invoke θα εκτελέσει τον κώδικα που θα του δώσεις στο UI thread. Το Async όμως εκτελεί τον κώδικα σε άλλο, background thread. Οποιαδήποτε κλήση κάνεις προς το textbox μέσα από το async χρειάζεται Invoke. Προφανώς αν γίνει αυτό, αχρηστεύεται το async.

    Εννοείς ότι με αυτό τον τρόπο δεν θα γίνεται παράλληλα με το UI Thread, σωστά? Ναι, αυτό θέλω, να γίνονται διαδοχικά (έτσι κι αλλιώς έχω βάλει "Await TaskEx.Run")

    Παναγιώτης Καναβός:

    Υπάρχουν πολλά πράγματα που μπορείς να κάνεις για να επιταχύνεις τον κώδικα, πρωτού χρησιμοποιήσεις async. 
    • Καταρχήν το επαναλαμβανόμενο search, αλλαγή font είναι πάρα πολύ αργό, καθώς για κάθε λέξη πρέπει πρώτα να κάνεις την αναζήτηση, μετά να αλλάξεις τα χρώματα και να αρχίσεις ξανά.

    Δεν γνωρίζω κάποιον άλλο τρόπο, αλλά θα μάθω τώρα :)

    Παναγιώτης Καναβός:

    • Καλύτερα να κάνεις όλες τις αναζητήσεις με τη μία και να βγάλεις τα αποτελέσματα σε μία λίστα με τις θέσεις που θέλεις και μετά να χρησιμοποιήσεις τη λίστα για να αλλάξεις τα χρώματα

    Πως το κάνω αυτό? Για τι είδους λίστα μιλάμε?

    Παναγιώτης Καναβός:

    • Δημιουργείς συνέχεια νέα αντικείμενα font τα οποία δεν σβήνεις ποτέ. Τα font είναι πολύ ακριβό resource και πρέπει πάντα να διαγράφονται. Επιπλέον, μπορείς να χρησιμοποιήσεις το ίδιο font object πολλές φορές.

    Δεν το ήξερα αυτό. Θα το αλλάξω λοιπών έτσι ώστε να χρησιμοποιώ πάντα ένα font.

    Ποια εντολή σβήνει ένα font παρεμπιπτόντως?

    Παναγιώτης Καναβός:

    • Η κλήση της Find για κάθε λέξη είναι επίσης πολύ αργή. Αν θέλεις να κάνεις πολλαπλές αναζητήσεις, απλά πάρε κάπου το Text του textbox και κάνε τις αναζητήσεις στο string αυτό αντί για το textbox, π.χ. χρησιμοποιώντας την String.IndexOf
      Ακόμα καλύτερα, μπορείς να χρησιμοποιήσεις την Regex.Matches για να επιστρέψεις όλες τις εμφανίσεις μίας λέξης με μία μόνο κλήση. Αυτό είναι πολύ ταχύτερο από τις επαναλαμβανόμενες κλήσεις στην String.IndexOf.

    Το  String.IndexOf αν και δεν το έχω ξαναχρησιμοποιήσει, καταλαβαίνω πως να το κάνω. Αλλά το Regex.Matches είναι κάτι εντελώς καινούργιο. Ήθελε να κάνω κάτι import, και βλέπω ότι γυρνάει system.Text.RegularExpression.MatchCollection

    Αυτό δεν είναι το integer που δουλεύουμε όμως... Πως χρησιμοποιείται?

    Παναγιώτης Καναβός:

    • Αν εξακολουθείς να έχεις καθυστερήσεις, μπορείς να χρησιμοποιήσεις ξανά την async για να κάνεις τις αναζητήσεις ασύγχρονα και να βγάλεις τα αποτελέσματα σε μία λίστα. Μόλις ολοκληρωθεί η αναζήτηση περνάς τη λίστα με τις λέξεις στο function που θα αλλάξει τα χρώματα με Invoke.

    Σίγουρα ότι και να κάνω θα γίνει με το Await του Async! αν ένας ερευνητής φορτώσει μια βάση δεδομένων με 800 σειρές, βάλε Β=999 και επιλέξει 6 στήλες, τότε έχουμε ένα διωνυμικό συντελεστή (6 ανά 2) = 16, άρα μιλάμε για 800*16*999 = 12787200 permuations.

    Αυτά θα βγάλουν ένα κείμενο ατελείωτο. Όσο optimized κι αν είναι ο αλγόριθμος ψαξίματος της λέξης, θα κολλήσει το UI. Γιαυτό σίγουρα θα το κάνουμε σε Async.

    Το θέμα είναι πως χρησιμοποιείται?




  •  23-02-2012, 16:31 69419 σε απάντηση της 69418

    Απ: Πρόβλημα με Async σε richTextBox

    Permutations??? Αν θέλεις να κάνεις υπολογισμούς, η χρήση του κειμένου ενός textbox είναι ο χειρότερος δυνατός τρόπος. Αν θέλεις να "σκαλίσεις" τα δεδομένα από κάποιο κείμενο, φόρτωσε τα, διάβασε τα γραμμή-γραμμή και γέμισε ένα πίνακα ή μία λίστα (εννοώ το κλασσικό List, ή όποιο άλλο collection σε βολεύει) και μετά κάνε τους υπολογισμούς που θέλεις.

    800 γραμμές είναι μηδαμινές ως όγκος δεδομένων, όσο μακρυές και αν είναι. Όσο για τα Β και τις στήλες ... δεν καταλαβαίνω καν τί εννοείς. Ίσως να είναι κάτι που έχεις συζητήσει σε άλλο, άσχετο post.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  23-02-2012, 16:58 69421 σε απάντηση της 69419

    Απ: Πρόβλημα με Async σε richTextBox

    Οι πράξεις γίνονται σε μεταβλητές Double()().

    800 γραμμές είναι του dataset. Το κείμενο αυτό δείχνει όλα τα permutations που έγιναν, τα οποία είναι 800 (γραμμές) * (Β φορές το οποίο διαλέγει ο χρήστης) * Το διωνυμικό συντελεστή των στηλών ανά 2, άρα πες *16 = 12787200 σειρές ΜΟΝΟ τα permutations.

    (και αυτό ΔΕΝ είναι ούτε καν κοντά στο worst case scenario)

    Αν σκεφτείς και τα υπόλοιπα δεδομένα που περιέχει (Maximum Vertical Deviation, ks p-value, texts..) τότε χαθήκαμε.

    Αλλά ξεφύγαμε απο το point όμως. 


    Crap, δεν ξέρω το List(of T)

    anyway, θα το κοιτάξω τώρα.

    Αν θες απάντησέ μου στις ερωτήσεις που έκανα πάνω στο προηγούμενο πόστ σου, και ειδικά αυτή για το "Regex.Matches"

    Aν μπορείς να μου γράψεις και ένα μικρό παραδειγματάκι χρησιμοποιώντας αυτό για να το καταλάβω καλύτερα θα ήταν τέλεια.


    Ευχαριστώ για τη βοήθεια


  •  23-02-2012, 18:09 69423 σε απάντηση της 69421

    Απ: Πρόβλημα με Async σε richTextBox

    To MatchCollection αποτελείται από Match αντικείμενα. Αν η λέξη που ψάχνεις βρίσκεται σε 5 φορές μέσα στο κείμενο, το MatchCollection θα περιέχει 5 Match.
    Το Match έχει ένα property Index με την θέση της λέξης.


    Π.χ. 5 φορές το "ABC"
               MatchCollection matches = Regex.Matches("asdaABCdsadaABCertyuuiaABChjghjABChgjhgjhjABCsdfsdfs", "ABC");
                foreach(Match item in matches)
                {
                    rtb.SelectionStart = item.Index; 
                    rtb.SelectionLength = item.Length; 
                    rtb.SelectionFont = boldFont;
                }
    Τα Font πρέπει να γίνονται Dispose() για να διαγραφούν.
    Φτιάξε ένα Font member και να χρησιμοποιείς πάντα αυτό χωρίς να δημιουργείς νέα. 
            Font boldFont;
            public Form1()
            {
                InitializeComponent();
                boldFont = new Font(rtb.Font, FontStyle.Bold);
            }




  •  23-02-2012, 18:17 69424 σε απάντηση της 69423

    Απ: Πρόβλημα με Async σε richTextBox

    Ευχαριστώ πολύ,

    όταν βρω το χρόνο να συνεχίσω το πρόγραμμα θα το δοκιμάσω αμέσως και θα απαντήσω σε αυτό το thread.


    thanks :)


  •  23-02-2012, 19:01 69425 σε απάντηση της 69424

    Απ: Πρόβλημα με Async σε richTextBox

    Αν γνωρίζεις ακριβώς ποιo(-α) είναι to permutation που ζητάς, δε χρειάζεται να παράγεις όλο το σύνολο των permutations για να το βρεις. Ρίξε μια μιατιά στο άρθρο String Permutations (έχει και κώδικα που μπορείς να κάνεις download). Πιθανόν οι τεχνικές που αναφέρονται εκεί σε βοηθήσουν να βελτιστοποιήσεις τον κώδικά σου. Επίσης βρήκα και αυτό το link (TextMechanic). Είναι λίγο off topic, αλλά μπορεί να σου δώσει ιδέες για προσθέσεις λειτουργικότητα στην εφαρμογή σου.

    [Προσθήκη]

    Μπορεί να φανεί αιρετικό αυτό που θα πω, αλλά διαβάζοντας το άρθρο μου δημιουργήθηκε η εντύπωση ότι με κάθε νέο search ίσως είναι πιο γρήγορο να "ξαναπαράγεις" τα permutations και να "χρωματίζεις" εκείνα που σ' ενδιαφέρουν καθώς κάνεις append το string, παρά να ψάχνεις ξανά και ξανά ένα πιθανώς χαοτικό σε μέγεθος string. Οι υπόλοιποι, τι λέτε επ' αυτού;

    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  23-02-2012, 23:35 69428 σε απάντηση της 69423

    Απ: Πρόβλημα με Async σε richTextBox

    nikos123:
    To MatchCollection αποτελείται από Match αντικείμενα. Αν η λέξη που ψάχνεις βρίσκεται σε 5 φορές μέσα στο κείμενο, το MatchCollection θα περιέχει 5 Match.
    Το Match έχει ένα property Index με την θέση της λέξης.

    Π.χ. 5 φορές το "ABC"
               MatchCollection matches = Regex.Matches("asdaABCdsadaABCertyuuiaABChjghjABChgjhgjhjABCsdfsdfs", "ABC");
                foreach(Match item in matches)
                {
                    rtb.SelectionStart = item.Index; 
                    rtb.SelectionLength = item.Length; 
                    rtb.SelectionFont = boldFont;
                }
    Τα Font πρέπει να γίνονται Dispose() για να διαγραφούν.
    Φτιάξε ένα Font member και να χρησιμοποιείς πάντα αυτό χωρίς να δημιουργείς νέα. 
            Font boldFont;
            public Form1()
            {
                InitializeComponent();
                boldFont = new Font(rtb.Font, FontStyle.Bold);
            }


    Ok, ακολούθησα τα guidelines και έγραψα αυτό:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
        Public Sub ColouriseRTB(ByVal rtb As RichTextBox, ByVal ColourizeableText As String, ByVal rtbFontStyle As FontStyle, ByVal rtbColour As Color, ByVal rtbBackColour As Color, Optional ByVal iLengthDeviation As Integer = 0)
            Dim rtbMatches As MatchCollection
            Dim rtbText As String = rtb.Text
            Dim WorkSpacefont As Font = New Font(rtb.Font, rtbFontStyle)
    
            rtbMatches = Regex.Matches(rtbText, ColourizeableText, RegexOptions.None)
            If rtbMatches.Count > 0 Then
                For Each item As Match In rtbMatches
                    rtb.SelectionStart = item.Index
                    rtb.SelectionLength = item.Length + iLengthDeviation
                    rtb.SelectionFont = WorkSpacefont
                    rtb.SelectionColor = rtbColour
                    rtb.SelectionBackColor = rtbBackColour
                Next
            End If
            WorkSpacefont.Dispose()
    
        End Sub
    
        Private Async Sub rtbWorkSpace_TextChanged(sender As System.Object, e As System.EventArgs) Handles rtbWorkgroup.TextChanged
            If rtbWorkgroup.Text <> "" Then
                mniExportImWindow.Enabled = True
                mniExportEverything.Enabled = True
    
                If DatasetLength = 2 Then
                    Call Controls2DBStatusNormal()
                Else
                    Call ControlsManyDBStatusNormal()
                End If
    
                If showOutputColoured = True Then
                    If (CombinationsCount * T_Repetition * n_NumberOfErrors) < (3 * 200 * 100) Then 'So as not to crush UI
                        ColouriseRTB(rtbWorkgroup, (txtLanguage.Lines(71)), FontStyle.Bold, WorkSpaceMainVariablesColours, DefaultBackColor) 'Permutation
                    End If
    
                    ColouriseRTB(rtbWorkgroup, txtLanguage.Lines(66), FontStyle.Bold, WorkSpaceMainVariablesColours, DefaultBackColor) 'Permutations
    
                    ColouriseRTB(rtbWorkgroup, txtLanguage.Lines(67), FontStyle.Bold, WorkSpaceMainVariablesColours, DefaultBackColor) 'Max Vertical Deviation
    
                    ColouriseRTB(rtbWorkgroup, txtLanguage.Lines(58), FontStyle.Bold, WorkSpaceMainVariablesColours, DefaultBackColor) 'KS p-value REC
    
                End If
    
            Else
                Call ControlsStatusDisableAll()
    
            End If
        End Sub

    Είναι εντάξει τώρα?

  •  24-02-2012, 10:19 69431 σε απάντηση της 69428

    Απ: Πρόβλημα με Async σε richTextBox

    Εσένα κάνει αυτά που θες (και σχετικά γρήγορα) το πρόγραμμα;

    Όσο για το WorkSpaceFont μην το δημιουργείς και το καταστρέφεις σε κάθε κλήση της CororiseRTB .
    Δήλωσε το ως member στη φόρμα, αρχικοποιήσε το μια φορά στο constructor (μετά το InitialiseComponent) και μην το κάνεις Dispose μέσα στην ColoriseRTB.

    Επίσης προσπάθησε να μην καλείς με πολλές παραμέτρους τις συναρτήσεις (5 στην ColoriseRTB , 2 μόνο για το Font).

    To async απ' όσο ξέρω δεν κάνει κάτι αφού δεν έχεις await.

    Ο έλεγχος matches.Count >0 δεν χρειάζεται


  •  24-02-2012, 11:49 69432 σε απάντηση της 69431

    Απ: Πρόβλημα με Async σε richTextBox

    nikos123:
    Εσένα κάνει αυτά που θες (και σχετικά γρήγορα) το πρόγραμμα;

    Ναι, πολύ πιο γρήγορα απότι πριν. Αλλά για Β>400 κολλάει πολύ και πάλι. Γιαυτό πρέπει να το κάνω σε Async.


    nikos123:
    Όσο για το WorkSpaceFont μην το δημιουργείς και το καταστρέφεις σε κάθε κλήση της CororiseRTB .
    Δήλωσε το ως member στη φόρμα, αρχικοποιήσε το μια φορά στο constructor (μετά το InitialiseComponent) και μην το κάνεις Dispose μέσα στην ColoriseRTB.

    Εννοείς να το βάλω ByVal? Το έχω ήδη κάνει..
    "Αρχικοποίησε το" τι εννοείς?
    Δεν έχει πουθενά "  InitialiseComponent"... άρα τι κάνω?
    Που να το κάνω dispose ???
    let me pinpoint the fact that καλώ αυτή τη συνάρτηση και σε άλλες μεριές. 

    nikos123:
    Επίσης προσπάθησε να μην καλείς με πολλές παραμέτρους τις συναρτήσεις (5 στην ColoriseRTB , 2 μόνο για το Font).

    Όλες οι παράμετροι είναι valid. Δεν θα μπορούσα να την καλέσω με λιγότερες... αν μπορείς να μου την φτιάξεις αλλιώς, τότε πλζ, κάντο για να το δω.

    Note: Στις άλλες μεριές που την καλώ, χρειάζεται να βάψω και το background color, όπως και το "bold" αλλάζει σε "underline". δλδ μπορεί στο rtbWorkSpace_TextChanged να τα βλέπεις όλα ίδια, αλλά δεν είναι στις επόμενες.
    Γιαυτό δεν πιστεύω ότι μπορεί να γίνει με λιγότερες παραμέτρους.


    nikos123:
    To async απ' όσο ξέρω δεν κάνει κάτι αφού δεν έχεις await.
    Σωστό είναι αυτό που λες. Αλλά αφού στο τέλος θα την κάνουμε async, δεν έχει νοήμα να το βγάλω τώρα για να το ξαναβάλω μετά.

    nikos123:
    Ο έλεγχος matches.Count >0 δεν χρειάζεται

    Αχά, έχει απο μόνο του έλεγχο? Καλό :)
    Το έβγαλα λοιπών.


    Φίλε μου Νίκο σε ευχαριστώ πολύ για την βοήθειά σου.
    Όταν έχεις χρόνο, σκέψου πως μπορούμε να το κάνουμε και async... είναι πολύ σημαντικό αυτό.

  •  24-02-2012, 12:59 69434 σε απάντηση της 69432

    Απ: Πρόβλημα με Async σε richTextBox

    AlKiS:
    nikos123:
    Εσένα κάνει αυτά που θες (και σχετικά γρήγορα) το πρόγραμμα;

    Ναι, πολύ πιο γρήγορα απότι πριν. Αλλά για Β>400 κολλάει πολύ και πάλι. Γιαυτό πρέπει να το κάνω σε Async.



    Και θα συνεχίσεις να έχεις πρόβλημα όσο αρνείσαι να κατανοήσεις ότι το πρόβλημά σου είναι πρωτίστως αλγοριθμικό και δευτερευόντως (αλλά ΠΟΛΥ δευτερευόντως) προγραμματιστικό. Ο λόγος είναι απλός: Σε προβλήματα μεταθέσεων (permutations) και συνδυασμών (combinations) ΔΕΝ υπάρχει worst case scenario.

    Πάρε για παράδειγμα ένα string permutation πρόβλημα με 15 strings {s1, s2,..., s15}. Το πλήθος των permutations είναι 1307674368000. Αν θέλεις να κάνεις search για να βρεις τα permutations με γενικό σχήμα {*,s4,s12} είναι ΠΟΛΥ προτιμότερο να τα παράγεις από την αρχή. Στην ουσία αυτό που πρέπει να κάνεις είναι να ανάγεις το search σε permutation πρόβλημα δεκατριών strings και να προσθέσεις στο τέλος τα s4 και s12. Στο πρόβλημα των 13, το σύνολο των permutations είναι 6227020800 (το 0,48% του συνόλου του αρχικού προβλήματος των 15). Το search, λοιπόν, στο αρχικό σύνολο είναι ασύμφορο. Επιπλέον, είναι εντελώς παράλογο να κρατάς τόσα πολλά δεδομένα στη μνήμη. Και το παράδειγμα που ανέφερα είναι πολύ απλό. Σε πιο σύνθετες αναζητήσεις, η προσέγγιση πρέπει να είναι πιο εκλεπτυσμένη από ένα μετωπικό brute force, αλλιώς δεν θα τελειώσεις ποτέ!

    Τώρα, το προγραμματιστικό σου πρόβλημα ακούει στο όνομα RTB. Ό,τι χειρότερο. Άκουσε τον Παναγιώτη και ακολούθησε τη συμβουλή του και βάζε τα permutations σε λίστα. Διαφορετικά, καμία τεχνική threading δεν πρόκειται να σε σώσει. Αν θέλεις, για να καταλάβουμε κι εμείς καλύτερα τι θέλεις να κάνεις, δώσε μας ένα παράδειγμα με τα permutations που παράγεις και τις αναζητήσεις που κάνεις.

    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  24-02-2012, 13:07 69435 σε απάντηση της 69434

    Απ: Πρόβλημα με Async σε richTextBox

    Markos:
    Και θα συνεχίσεις να έχεις πρόβλημα όσο αρνείσαι να κατανοήσεις ότι το πρόβλημά σου είναι πρωτίστως αλγοριθμικό και δευτερευόντως (αλλά ΠΟΛΥ δευτερευόντως) προγραμματιστικό. Ο λόγος είναι απλός: Σε προβλήματα μεταθέσεων (permutations) και συνδυασμών (combinations) ΔΕΝ υπάρχει worst case scenario.

    Πάρε για παράδειγμα ένα string permutation πρόβλημα με 15 strings {s1, s2,..., s15}. Το πλήθος των permutations είναι 1307674368000. Αν θέλεις να κάνεις search για να βρεις τα permutations με γενικό σχήμα {*,s4,s12} είναι ΠΟΛΥ προτιμότερο να τα παράγεις από την αρχή. Στην ουσία αυτό που πρέπει να κάνεις είναι να ανάγεις το search σε permutation πρόβλημα δεκατριών strings και να προσθέσεις στο τέλος τα s4 και s12. Στο πρόβλημα των 13, το σύνολο των permutations είναι 6227020800 (το 0,48% του συνόλου του αρχικού προβλήματος των 15). Το search, λοιπόν, στο αρχικό σύνολο είναι ασύμφορο. Επιπλέον, είναι εντελώς παράλογο να κρατάς τόσα πολλά δεδομένα στη μνήμη. Και το παράδειγμα που ανέφερα είναι πολύ απλό. Σε πιο σύνθετες αναζητήσεις, η προσέγγιση πρέπει να είναι πιο εκλεπτυσμένη από ένα μετωπικό brute force, αλλιώς δεν θα τελειώσεις ποτέ!

    Τα permutations δεν γίνονται σε αυτό τον αλγόριθμο! Ότι ήταν να γίνει με permutation έχει ήδη γίνει. Έχει περάσει στην R (γλώσσα προγραμματισμού), έχω ήδη πάρει πίσω αποτελέσματα για kolmogorov και τα λοιπά... είναι άσχετο αυτό.

    Τα permutations γίνονται πολύ γρήγορα. Πρόβλημα έχω στο να χρωματίσω το κείμενο...



    Markos:
    Τώρα, το προγραμματιστικό σου πρόβλημα ακούει στο όνομα RTB. Ό,τι χειρότερο. Άκουσε τον Παναγιώτη και ακολούθησε τη συμβουλή του και βάζε τα permutations σε λίστα. Διαφορετικά, καμία τεχνική threading δεν πρόκειται να σε σώσει. Αν θέλεις, για να καταλάβουμε κι εμείς καλύτερα τι θέλεις να κάνεις, δώσε μας ένα παράδειγμα με τα permutations που παράγεις και τις αναζητήσεις που κάνεις.

    Επίσης, έχω ακολουθήσει αυτό που μου είπαν, και δεν κάνω search πάνω στο κείμενο του rtb, αλλά σε string. Κοίτα τον τελευταίο κώδικα που έγραψα και θα το δεις.


    Υ.Γ. Nikos123 μην μπερδευτείς με το μήνυμα αυτό που έγραψα. Οι ερωτήσεις που έχω στο προηγούμενο μήνυμα ισχύουν ακόμα.


    Ευχαριστώ πολύ και τους 2 για την προσπάθειά σας να με βοηθήσετε :)


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