need help about time.sleep, timer

Sinan Nalkaya erchamion.beren at gmail.com
Tue Nov 22 08:28:53 EST 2005


Bengt Richter wrote:

>On Mon, 21 Nov 2005 10:35:20 +0200, Sinan Nalkaya <erchamion.beren at gmail.com> wrote:
>
>  
>
>>Dennis Lee Bieber wrote:
>>
>>    
>>
>>>On Fri, 18 Nov 2005 22:45:37 -0500, Peter Hansen <peter at engcorp.com>
>>>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.



More information about the Python-list mailing list