2016-08-01 92 views
0

我需要每隔x秒调用一次函数,但可以选择手动调用它,在这种情况下需要重置时间。我也有东西是这样的:Python暂停线程,手动执行并重置时间

import time 
import threading 

def printer(): 
    print("do it in thread") 

def do_sth(event): 
    while not event.is_set(): 
     printer() 
     time.sleep(10) 

event = threading.Event() 
print("t - terminate, m - manual") 
t = threading.Thread(target=do_sth, args=(event,)) 
t.daemon = True 
t.start() 
a = input() 
if a == 't': 
    event.set() 
elif a == 'm': 
    event.wait() 
    printer() 
    event.clear() 

更新: 我发现的东西,对我帮助很大:Python - Thread that I can pause and resume 现在我的代码看起来是这样的:

import threading, time, sys 

class ThreadClass(threading.Thread): 

    def __init__(self): 
     threading.Thread.__init__(self) 
     self.can_run = threading.Event() 
     self.thing_done = threading.Event() 
     self.thing_done.set() 
     self.can_run.set() 

    def run(self): 
     while True: 
      self.can_run.wait() 
      try: 
       self.thing_done.clear() 
       self.do_in_thread() 
      finally: 
       self.thing_done.set() 
      time.sleep(5) 

    def pause(self): 
     self.can_run.clear() 
     self.thing_done.wait() 

    def resume(self): 
     self.can_run.set() 

    def do_in_thread(self): 
     print("Thread...1") 
     time.sleep(2) 
     print("Thread...2") 
     time.sleep(2) 
     print("Thread...3") 


def do_in_main(): 
    print("Main...1") 
    time.sleep(2) 
    print("Main...2") 
    time.sleep(2) 
    print("Main...3") 

if __name__ == '__main__': 

    t = ThreadClass() 
    t.daemon = True 
    t.start() 
    while True: 
     i = input() 
     if i == 'm': 
      t.pause() 
      do_in_main() 
      t.resume() 
     elif i == 't': 
      sys.exit() 
      # t.join() 

唯一的问题是,当我结束,希望线程在退出前完成工作。

+1

由于SO不是代码编写的服务:你有什么具体的问题呢? –

+0

对不起,我没有提到它不起作用。我的意思是我手动调用功能打印机的部分。这段代码不正确,所以你能告诉我我做错了什么? – user2357858

回答

0

这可能是缓冲输出是罪魁祸首,因此 - 你正在得到你的预期行为。

我改变你的代码下面,它似乎做一些事情(如果这是你想要的东西,是由你):

import time 
import threading 

def printer(): 
    print("do it in thread") 

def do_sth(event): 
    print("event.is_set:", event.is_set()) 
    while not event.is_set(): 
     printer() 
     time.sleep(10) 

event = threading.Event() 
print("t - terminate, m - manual") 
t = threading.Thread(target=do_sth, args=(event,)) 
print("t:",t) 
t.daemon = True 
t.start() 
a = input() 
if a == 't': 
    event.set() 
elif a == 'm': 
    event.wait() 
    printer() 
    event.clear()