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>

Reply via email to