Hi Tomis!
Thanks for the idea.
I did this already by using a Thread class with low priority. So the
user input isn't slowed down by my calculations and the result comes
whenever it is ready, without pulling the whole CPU power...
I guess this is not the same, but similar to your approach.
Thanks,
Marcel
On 01.05.2006, at 07:08, Tomis E. wrote:
Another potential optimization would be to use a timer instead of
firing off on every keypress. A
period of 1 second would feel "instant" enough I'd think, and it
could reduce the CPU usage
significantly.
On each keydown I'd have something like
if tmrWordCount.mode<>1 then
tmrWordCount.mode=1
end
And then tmrWordCount's action event would call the word count
procedures. This way, you limit the
call to a minimum of getting called every second.
Note that when you change a timer's mode, it's internal counter
starts over, so you need that "if
- then" block, otherwise it wouldn't update until the user hadn't
been typing for 1 second. That
would probably reduce CPU usage even more, though it might make the
live word count feel sluggish.
Hope that helps,
~ Tomis
--- Marcel <[EMAIL PROTECTED]> wrote:
Hello everybody!
Maybe somebody finds this trick useful:
(... and maybe someone finds a trap, I haven't seen?)
I make heavy use of styled EditFields in my project. After playing
around, I found out that the call of the method...
aNumberOfParagraphs = anEditField.StyledText.ParagraphCount()
... is very time consuming. About a second (!) for 30 paragraphs on
a 1,25 GHz G4.
Because I have to test the number of paragraphs after each keystroke,
you can imagine that this timeframe isn't acceptable at all.
When I count the EndOfLines in my text with ...
aNumberOfParagraphs = CountFields(anEditField.Text, EndOfLine)
... I get (almost) the right value. I just recognized that "empty"
lines in the text don't generate a paragraph in a styled EditField.
So I removed them before counting ...
aNumberOfParagraphs = CountFields(ReplaceAll(aField.Text,
(EndOfLine + EndOfLine), EndOfLine), EndOfLine)
This was almost working, I just saw that multiple empty lines in a
row were not eliminated right. Using a grep sequence finally solved
it...
aRegEx.SearchPattern = "^[\f\n\r]+"
aRegEx.ReplacementPattern = ""
aTextToCount = aField.Text
do
aRegExMatch=aRegEx.Search(aTextToCount)
if (aRegExMatch <> Nil) then
aTextToCount = aRegEx.Replace(aTextToCount)
end
loop until (aRegExMatch = Nil)
aParaLastIndex = CountFields(aTextToCount, EndOfLine)
In my tests the above CountFields() call always returns the same
values as the ParagraphCount() call. It needs always a processing
time of about 1 tick (1/60 of a second), with up to 70 paragraphs and
16,000 chars tested.
Maybe you want to replace the ParagraphCount() calls in your code and
try it. I would be very interested in feedback. Can I trust this
"work-around"? Does someone has any objections arising, I do not see?
Thanks and best wishes,
Marcel
_______________________________________________
Unsubscribe or switch delivery mode:
<http://www.realsoftware.com/support/listmanager/>
Search the archives of this list here:
<http://support.realsoftware.com/listarchives/lists.html>
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
_______________________________________________
Unsubscribe or switch delivery mode:
<http://www.realsoftware.com/support/listmanager/>
Search the archives of this list here:
<http://support.realsoftware.com/listarchives/lists.html>
_______________________________________________
Unsubscribe or switch delivery mode:
<http://www.realsoftware.com/support/listmanager/>
Search the archives of this list here:
<http://support.realsoftware.com/listarchives/lists.html>