Alex,

Thank you for your message. I'm not very at ease with messages and the command "send" but I will test your code. I think it is the good way to not slow down the typing of the user.

Jerome Rosat

Le 23 oct. 2009 à 00:33, Alex Tweedly a écrit :


Would it be practical to break your list into 26 sublists by first letter?
That's a pragmatic approach - but I think it's the wrong one.

The fundamental problem is that the idea of scanning an entire list at keystroke speed is not robust. Even if splitting into multiple lists works for now, there's no guarantee that it will work tomorrow - when the database doubles in size, or the data becomes skewed because it contains too many people with the same first letter, or .... or the users demand a similar feature for address as well as surname, or they want to match string anywhere within the name, or ....

What you ought to do (imnsho) is to change the algorithm to one which is inherently responsive, using either 'send' or 'wait-with- messages' to ensure that this matching process does not interfere with responsiveness. In this case, I think it's easier to use wait- with-messages.

So in outline

each time the match data changes, you restart the matching process

the matching process checks a fixed, and relatively small, number of possible matches
    updates the field showing the user what matches have been found
and then allows other things to happen before continuing with the matching.

I'd have a single handler that is always called when any changes happens to the user input, which can kick off a new matching process (by sending to the match handler). Then within the handler, I'd periodically check whether there is a pending message to restart a new handler.

So a brief version of the whole script would be

local sShow, sStart, sData, sFound,sMatch
global gData

on keyUp
  matchStringHasChanged
  pass keyUp
end keyUp

on matchStringHasChanged
  send "processamatch" to me in 0 millisecs
end matchStringHasChanged

on processamatch
  local tCount
     put gData into sData
  put the text of field "Field" into sMatch
     put empty into field "Show"
  put empty into sShow
     repeat for each line L in sData
     add 1 to tCount
     if L begins with sMatch then
        put L &CR after sShow
     end if
     if tCount mod 100 = 0 then
        put sShow & "....." & CR into field "Show"
        wait 0 millisecs with messages
        if the pendingmessages contains ",processamatch," then
           put "exiting" & CR after field "StatusLog"
           exit processamatch
        end if
     end if
  end repeat
  put sShow into field "Show"
put "Completed" && the number of lines in sShow &CR after field "StatusLog"
end processamatch



Note the use of "......" to give an indication that work is still in progress and there may be more matches to come.

You could easily add refinements to this

1a. if a matching process has completed (rather than exited), and if previous match string was a substring of the new matchstring, then instead of starting with
        put gData into sData
you could instead do
        put sShow into sData
(i.e. re-use the filtered list - but be sure to remember that if you exit before completing, or if the matchstring changes in any other way you need to restart with the whole of gData)

1b. If you do 1a, then if you are *nearly* complete with a match when the matchstring changes, then just go ahead and complete it, so you get to work on the subset.
(good luck deciding what *nearly* means :-)

btw - I don't think there is any magic 'split'-based method possible here.


-- Alex.
_______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution

_______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution

Reply via email to