输入和线程问题,python

时间:2009-02-09 08:34:41

标签: python multithreading

我在python中做了类似的事情

class MyThread ( threading.Thread ):
    def run (s):
        try:
            s.wantQuit = 0
            while(not s.wantQuit):
                button = raw_input()
                if button == "q":
                    s.wantQuit=1
        except KeyboardInterrupt:
            s.wantQuit = 1

myThread = MyThread ()
myThread.start()

a=5
while not myThread.wantQuit:
    print "hey"
    if (a == 0):
        break;
    a = a-1;
    time.sleep(1)
#"""
sys.exit()

我的应用程序会锁定5秒钟“嘿”(5次)然后我得到raw_input对话框。如何让对话框显示出来,以便我可以随时退出而不是在循环用完时?

4 个答案:

答案 0 :(得分:1)

你的意思是while循环在线程之前运行?好吧,除非你同步它,否则你无法预测。没有人保证线程将在while循环之前或之后运行。但是,如果它被阻挡了5秒钟,那么那个线程应该已经被抢占了。

此外,由于你首次在run()方法中使用了wantToQuit,所以当你在while not myThread.wantToQuit中检查它的wantToQuit属性时,没有人向你保证线程已经启动。

答案 1 :(得分:1)

这里的行为不是你所描述的。 看看我得到的那些样本输出:

第一:尽可能快地按q<ENTER>

hey
q

第二名:在按q<ENTER>之前稍等一下:

hey
hey
hey
q

第3名:请勿触摸键盘:

hey
hey
hey
hey
hey
hey
# Application locks because main thread is over but 
# there are other threads running. add myThread.wantQuit = 1
# to prevent that if you want

答案 2 :(得分:0)

只是尝试了代码以确保,但这确实做了它应该做的...你可以输入q并输入到控制台并使应用程序在a = 0之前退出(所以它说它少了5次)

我不知道raw_input对话框的意思,raw_input通常只从stdin获取信息

答案 3 :(得分:0)

huperboreean有你的答案。执行for循环时,线程仍在启动。

您希望在进入循环之前检查线程是否已启动。 您可以简化线程以监视raw_input,并在输入“q”时返回。这会杀死线程。

你的主循环可以检查线程是否还活着。