Bengt Richter wrote:
>On Mon, 21 Nov 2005 10:35:20 +0200, Sinan Nalkaya <[EMAIL PROTECTED]> wrote: > > > >>Dennis Lee Bieber wrote: >> >> >> >>>On Fri, 18 Nov 2005 22:45:37 -0500, Peter Hansen <[EMAIL PROTECTED]> >>>declaimed the following in comp.lang.python: >>> >>> >>> >>> >>> >>>>It's quite unclear whether the last part, above, is one of your >>>>*requirements*, or a description of a problem you are having with your >>>>current approach. Do you *want* it to wait forever if you don't enter >>>>anthing? >>>> >>>> >>>> >>>> >>>> >>> As I understand it, he (?) wants to accumulate characters to be >>>passed to a certain function -- but the function is not to be invoked >>>until after a time period has expired; the time period resetting on each >>>character entered. >>> >>> Something I'd do with threads, queues, and sleep... >>> >>>PSEUDOCODE >>> >>>thread1: >>> while not Shutdown: >>> ch = getChar() >>> q.put(ch) >>> >>> >>>thread2: #or main >>> while not Shutdown: >>> chars = [] >>> while True: >>> sleep(max_interval) >>> if q.empty(): break #no input since start of sleep >>> while not q.empty(): #collect all input from sleep >>> chars.append(q.get()) >>> inp = "".join(chars) >>> function(inp) >>> >>> >>> >>> >>> >>> >>> >>i appreciate your comments and ideas. Dennis told exactly what i tried >>to say :), code seems to be fine but during sleep action i think the >>above code does not execute >> >>if q.empty(): break #no input since start of sleep >> while not q.empty(): >> chars.append(q.get()) >> >>i need something, while sleeping, executes the function that waits for >>input from keyboard. >>i imagined something like that, i have a queu, it both stores the keys >>that pressed and pressing times of these keys, then i`ll proccess these >>times. here is scenario >>input : 5 >>after 10 seconds later input 5 is being proccessed >>return back to main function >>input : 1 >>after 5 seconds , other input 5 >>after 5 more seconds , 15 is being proccessed >>Thanks. >> >> > >If I understand, you really don't want to sleep, you want to wait a max time >of 5 seconds >for a character. You can get that from a queue.get(True,5) hence, you could >try the >following as a start (untested, and I don't have much experience with python >threading, >so will wait for bug reports ;-) > >Note that it uses getch for input, which doesn't echo. (Change to getche if >you want echo) >You can run this from the command line with one arg: the number of seconds you >want to >have the test continue. At the end of that time it will set the Shutdown >event, and >thread2 should empty the queue and wait 5 seconds and then do its last >function call and >see the shutdown event. > >----< tqinp.py >>----------------------------------------------------------------------- ># tqinp.py -- test queued input of unechoed character input until a 5-second >delay >import threading >import Queue >import msvcrt >queue = Queue.Queue(10) # 2 is prob enough for this thing >Shutdown = threading.Event() > >def getChar(): return msvcrt.getch() # blocks >def function(s): print 'function(%r)'%s > >def thread1(q): > while not Shutdown.isSet(): > ch = getChar() > q.put(ch) > >def thread2(q): #or main > while not Shutdown.isSet(): > chars = '' > try: > while True: chars += q.get(True, 5) > except Queue.Empty, e: > print 'No input for 5 seconds. Using %r'%chars > function(chars) > >import time >def test(trial_time): > thr1 = threading.Thread(target=thread1, args=(queue,)) > thr1.start() > thr2 = threading.Thread(target=thread2, args=(queue,)) > thr2.start() > t0 = time.clock() > time.sleep(trial_time) > print 'Ending trial after %s seconds' % (time.clock()-t0) > Shutdown.set() > >if __name__ == '__main__': > import sys > if not sys.argv[1:]: raise SystemExit,'Usage: python tqinp.py' > test(float(sys.argv[1])) >--------------------------------------------------------------------------------------- > >Ok, in the following I'll type 123 <pause 5> abc <pause to let it die> > >[ 5:40] C:\pywk\clp\threadstuff>py24 tqinp.py 15 >No input for 5 seconds. Using '123' >function('123') >No input for 5 seconds. Using 'abc' >function('abc') >Ending trial after 14.9948775627 seconds >No input for 5 seconds. Using '' >function('') > >[ 5:41] C:\pywk\clp\threadstuff> > >Except it didn't die until I hit another key to let thread1 loop and see its >Shutdown test. >But this is alpha 0.01, so you can fix that various ways. Or maybe get the >real requirements down ;-) >HTH >(once I get it posted -- news reads ok now but news server is not accepting >posts. >I suspect they do system-hogging chores Sun night wee hours ;-/ > >Regards, >Bengt Richter > > thanks for all replies especially via with code ones ;) steve`s codes works perfectly except time part (ill look investigate it), i had to do little edit because i`m unix user and dont have msvcrt but no problem. also i am noticed that, i have to study on threading much as you said. thanks again. -- http://mail.python.org/mailman/listinfo/python-list