睡眠不中斷程序
回答
沒有比爲你準備的0計時器線程使自己的線程更簡單的方法:「世界城市論壇,世界城市論壇」
import threading
timer = None
def wuf():
global timer
print "Wuf-wuf!"
timer = threading.Timer(5, wuf)
timer.start()
timer = threading.Timer(5, wuf)
timer.start()
input() # Don't exit the program
該代碼將等待5秒鐘,然後開始打印每5秒鐘一次。
如果你想從主線程阻止它這樣做:
timer.cancel()
但如果您使用的是事件驅動的GUI系統,如wxPython的或PyQt的編寫GUI應用程序,那麼你應該使用他們的事件管理計時器。特別是如果你正在從定時器回調改變一些GUI狀態。
編輯: 哦,沒事,這裏是你的完整的答案:
import threading
seconds = 1 # Initial time must be the time+1 (now 0+1)
timer = None
def tick():
global seconds, timer
seconds -= 1
if seconds==0:
print("%i seconds left" % seconds)
print("Timer expired!")
return
# printing here will mess up your stdout in conjunction with input()
print("%i second(s) left" % seconds)
timer = threading.Timer(1, tick)
timer.start()
seconds += int(input("Initial countdown interval: "))
tick()
while 1:
seconds += int(input("Add: "))
if not timer.is_alive():
print("Restarting the timer!")
seconds += 1
tick()
或Easy版本螺紋(但有點clumsyer然後使用threading.Thread):
from thread import start_new_thread as thread
from time import sleep
seconds = 1 # Initial time+1
alive = 0
def _tick():
global seconds, alive
try:
alive = 1
while 1:
seconds -= 1
if seconds==0:
print("%i seconds left" % seconds)
print("Timer expired!")
alive = 0
return
# printing here will mess up your stdout in conjunction with input()
print("%i second(s) left" % seconds)
sleep(1)
except: alive = 0
def tick():
thread(_tick,())
# Then same as above:
seconds += int(input("Initial countdown interval: "))
tick()
while 1:
seconds += int(input("Add: "))
if not alive:
print("Restarting the timer!")
seconds += 1
tick()
你必須認識到,在線程內使用stdout將在input()輸出的提示消息之後插入打印的文本。
這會令人困惑。如果你想避免這一點,那麼你將不得不編寫另一個線程來從隊列中獲取消息並輸出它們。
如果最後一條消息是提示消息,則必須將其從屏幕上移除,寫入新消息,然後返回提示消息,並相應地定位光標。
你可以通過在線程的子類中實現類文件接口來實現。線程,然後用它替換sys.stdout。也許重寫input()以指示何時提示消息不存在,並讀取stdin。
您將需要使用線程來完成此操作。你所要做的就是創建threading.Thread
的子類,覆蓋run()
方法,並在該線程上添加一些外部控制方法。
下面是一個簡單的例子,您可以嘗試根據自己的口味進行調整。
import threading
import time
class SleepingThread(threading.Thread):
def __init__(self, sleep_for):
super(SleepingThread, self).__init__()
self.sleep_for = sleep_for
def run(self):
while self.sleep_for != 0:
time.sleep(1)
self.sleep_for -= 1
print("Done sleeping")
def add_seconds(self, seconds):
self.sleep_for += seconds
def get_sleep_for(self):
return self.sleep_for
sleeping_thread = SleepingThread(10)
sleeping_thread.start()
while True:
print(sleeping_thread.get_sleep_for())
sleeping_thread.add_seconds(int(input('add > ')))
,如果你想要去認真對待它,不要忘了join()
。
這不完全是我想要的。它仍然等待輸入,並且我希望它在每次輸入減少時都打印新的時間,而不是在輸入之後。 – lol
- 1. 中斷睡眠線程
- 2. 睡眠時線程中斷
- 3. 單線程中斷睡眠
- 4. Perl的線程中斷睡眠不行
- 5. 中斷或停止睡眠線程
- 6. 主題 - 睡眠和中斷
- 7. 阻塞或睡眠中斷處理程序
- 8. 睡眠()或睡眠()的準確程度
- 9. Qt中的可中斷睡眠?
- 10. Android程序中的睡眠功能
- 11. Time1中斷喚醒單片機睡眠
- 12. SBe上的Scala EBean(InterruptedException:睡眠中斷)
- 13. Java的睡眠所中斷異常
- 14. MySQL中的睡眠過程
- 15. 線程中睡眠問題
- 16. 睡眠過程中不給信號
- 17. 線程和睡眠()
- 18. WCF線程睡眠
- 19. Java線程睡眠
- 20. Andengine睡眠線程?
- 21. Openmp線程睡眠
- 22. PHP-FPM過程落在不間斷睡眠
- 23. 如何調試處於不間斷睡眠的進程?
- 24. 我怎樣才能把過程變成「不間斷睡眠」?
- 25. 當應用程序運行時睡眠在循環中,但睡眠太少
- 26. 睡在睡眠中的NSTimer
- 27. 睡眠內線程沒有睡眠外線程 - Java
- 28. iPhone Web應用程序從睡眠中醒來後,JavaScript事件中斷
- 29. 睡眠線程如何發送中斷給自己?
- 30. 中斷對象上的睡眠線程釋放鎖的異常
你絕對需要穿線。 –
您稱爲可變時間和使用時間模塊。 2個相同的名字。 – Dalen
哎呦!!!!!!!!!!! – lol