|
Îåêßíçóå áðü ôï ìÝëïò AlKiS. Τελευταία δημοσίευση από το μέλος Libra Storm στις 03-03-2012, 02:16. Υπάρχουν 19 απαντήσεις.
-
23-02-2012, 00:11
|
-
AlKiS
-
-
-
Μέλος από τις 12-01-2007
-
Volos
-
Δημοσιεύσεις 312
-
-
|
Πρόβλημα με 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
|
-
nikos123
-
-
-
Μέλος από τις 26-04-2006
-
-
Δημοσιεύσεις 104
-
-
|
Απ: Πρόβλημα με Async σε richTextBox
Δεν ξέρω αν φταίει μόνο αυτό αλλά και οι παρακάτω χρειάζονται έλεγχο για InvokeRequired (τον οποίο δεν κάνεις).
rtbWorkgroup.Find() txtLanguage.Lines rtbWorkgroup.Font
Κοίτα να ενώσεις τους ελέγχους σε έναν ώστε να μην γεμίσεις με πολλά μικρά Invoke.
|
|
-
23-02-2012, 14:51
|
-
AlKiS
-
-
-
Μέλος από τις 12-01-2007
-
Volos
-
Δημοσιεύσεις 312
-
-
|
Απ: Πρόβλημα με Async σε richTextBox
δεν ξέρω πως μπορώ να το κάνω σε ένα. μόνο το ένα κάτω απο το άλλο ξέρω, αλλά και πάλι δεν τοχω ξαναδοκιμάσει για να είμαι σίγουρος ότι δουλεύει.
Πάντως το "rtbWorkgroup.Find()" και το φόντ έχουν μέσα το rtbWorkgroup, άρα αφού στο invoke γράφω rtbWorkgroup
τότε δεν ισχύει για τα πάντα?
|
|
-
23-02-2012, 15:26
|
|
Απ: Πρόβλημα με 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
|
-
AlKiS
-
-
-
Μέλος από τις 12-01-2007
-
Volos
-
Δημοσιεύσεις 312
-
-
|
Απ: Πρόβλημα με 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
|
|
Απ: Πρόβλημα με Async σε richTextBox
Permutations??? Αν θέλεις να κάνεις υπολογισμούς, η χρήση του κειμένου ενός textbox είναι ο χειρότερος δυνατός τρόπος. Αν θέλεις να "σκαλίσεις" τα δεδομένα από κάποιο κείμενο, φόρτωσε τα, διάβασε τα γραμμή-γραμμή και γέμισε ένα πίνακα ή μία λίστα (εννοώ το κλασσικό List, ή όποιο άλλο collection σε βολεύει) και μετά κάνε τους υπολογισμούς που θέλεις.
800 γραμμές είναι μηδαμινές ως όγκος δεδομένων, όσο μακρυές και αν είναι. Όσο για τα Β και τις στήλες ... δεν καταλαβαίνω καν τί εννοείς. Ίσως να είναι κάτι που έχεις συζητήσει σε άλλο, άσχετο post.
Παναγιώτης Καναβός, Freelancer Twitter: http://www.twitter.com/pkanavos
|
|
-
23-02-2012, 16:58
|
-
AlKiS
-
-
-
Μέλος από τις 12-01-2007
-
Volos
-
Δημοσιεύσεις 312
-
-
|
Απ: Πρόβλημα με 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
|
-
nikos123
-
-
-
Μέλος από τις 26-04-2006
-
-
Δημοσιεύσεις 104
-
-
|
Απ: Πρόβλημα με 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
|
-
AlKiS
-
-
-
Μέλος από τις 12-01-2007
-
Volos
-
Δημοσιεύσεις 312
-
-
|
Απ: Πρόβλημα με Async σε richTextBox
Ευχαριστώ πολύ, όταν βρω το χρόνο να συνεχίσω το πρόγραμμα θα το δοκιμάσω αμέσως και θα απαντήσω σε αυτό το thread.
thanks :)
|
|
-
23-02-2012, 19:01
|
-
Markos
-
-
-
Μέλος από τις 26-10-2008
-
Αθήνα
-
Δημοσιεύσεις 874
-
-
|
Απ: Πρόβλημα με Async σε richTextBox
Αν γνωρίζεις ακριβώς ποιo(-α) είναι to permutation που ζητάς, δε χρειάζεται να παράγεις όλο το σύνολο των permutations για να το βρεις. Ρίξε μια μιατιά στο άρθρο String Permutations (έχει και κώδικα που μπορείς να κάνεις download). Πιθανόν οι τεχνικές που αναφέρονται εκεί σε βοηθήσουν να βελτιστοποιήσεις τον κώδικά σου. Επίσης βρήκα και αυτό το link ( TextMechanic). Είναι λίγο off topic, αλλά μπορεί να σου δώσει ιδέες για προσθέσεις λειτουργικότητα στην εφαρμογή σου. [Προσθήκη] Μπορεί να φανεί αιρετικό αυτό που θα πω, αλλά διαβάζοντας το άρθρο μου δημιουργήθηκε η εντύπωση ότι με κάθε νέο search ίσως είναι πιο γρήγορο να "ξαναπαράγεις" τα permutations και να "χρωματίζεις" εκείνα που σ' ενδιαφέρουν καθώς κάνεις append το string, παρά να ψάχνεις ξανά και ξανά ένα πιθανώς χαοτικό σε μέγεθος string. Οι υπόλοιποι, τι λέτε επ' αυτού;
Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
|
|
-
23-02-2012, 23:35
|
-
AlKiS
-
-
-
Μέλος από τις 12-01-2007
-
Volos
-
Δημοσιεύσεις 312
-
-
|
Απ: Πρόβλημα με 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
|
-
nikos123
-
-
-
Μέλος από τις 26-04-2006
-
-
Δημοσιεύσεις 104
-
-
|
Απ: Πρόβλημα με Async σε richTextBox
Εσένα κάνει αυτά που θες (και σχετικά γρήγορα) το πρόγραμμα;
Όσο για το WorkSpaceFont μην το δημιουργείς και το καταστρέφεις σε κάθε κλήση της CororiseRTB . Δήλωσε το ως member στη φόρμα, αρχικοποιήσε το μια φορά στο constructor (μετά το InitialiseComponent) και μην το κάνεις Dispose μέσα στην ColoriseRTB.
Επίσης προσπάθησε να μην καλείς με πολλές παραμέτρους τις συναρτήσεις (5 στην ColoriseRTB , 2 μόνο για το Font).
To async απ' όσο ξέρω δεν κάνει κάτι αφού δεν έχεις await.
Ο έλεγχος matches.Count >0 δεν χρειάζεται
|
|
-
24-02-2012, 11:49
|
-
AlKiS
-
-
-
Μέλος από τις 12-01-2007
-
Volos
-
Δημοσιεύσεις 312
-
-
|
Απ: Πρόβλημα με 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
|
-
Markos
-
-
-
Μέλος από τις 26-10-2008
-
Αθήνα
-
Δημοσιεύσεις 874
-
-
|
Απ: Πρόβλημα με 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
|
-
AlKiS
-
-
-
Μέλος από τις 12-01-2007
-
Volos
-
Δημοσιεύσεις 312
-
-
|
Απ: Πρόβλημα με 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
|
|
|