为何python多线程程序在末尾添加input()能运行,不添加就不能运行

程序简介:
该程序包含两个线程,一个线程就是不断的循环print一个递增的数,另一个线程就是监控键盘,如果键盘按下F12,则两个线程都停止。

出现的情况:
1.这个程序在python的IDLE(Shell)中按F5可以直接执行,但是双击.py文件不能执行。(我已经设置环境变量,双击其他单线程的程序都能直接执行的)
2.我发现双击这个程序的py文件,会有一个cmd框瞬间弹出,一些文字一闪而过。于是我就在程序末尾添加raw_input()语句,本来我是想看看那段一闪而过的文字的,没想到添加这句后,程序居然可以双击py文件运行了
3.可是,当我把程序用py2exe打包成exe时,貌似由于exe文件没有cmd那个框框,所以会报错。

请问大神:
为什么程序末尾添加raw_input()则可以双击py文件执行,而不添加这一句就不能执行?求解决方案?

**********************************************************************************

完整程序代码:

#!/usr/bin/env python
# -*- coding: GBK -*-
import pythoncom
import pyHook
import win32api
import win32con
import win32gui
import time
import thread
theEndString='1'
i=0
def onKeyboardEvent(event):
"处理键盘事件"
"判断是否终止程序"
if str(event.Key)=='F12': #按下F12后终止
win32api.PostQuitMessage() #注意!!!若执行这一步,则跳到pythoncom.PumpMessages()之后
return True

def PlayRecord(name):
global i
while True:
i +=1
print i
if theEndString == 'End':
break

thread.exit_thread() #结束线程
def WaitForKeyboard(name):
global theEndString
hm = pyHook.HookManager()
#监控键盘
hm.KeyDown = onKeyboardEvent
hm.HookKeyboard()
pythoncom.PumpMessages(10000) #消息循环

theEndString = 'End'
thread.exit_thread() #结束线程

def test():
thread.start_new_thread(PlayRecord, ('A',))
thread.start_new_thread(WaitForKeyboard, ('B',))

if __name__== '__main__':
test()
#raw_input() #添加这一句就能直接双击py文件运行,如果没有这一句则不能运行

因为你没有考虑主进程。主进程不如果不等待线程,自己先退出来了。操作系统会自动清空你的线。

所以这里要有一个input,其实你不用input而是用
while True:
time.sleep(1.0)
这样也是可以的。 就是让主进程等待。

你还可以设计主进程退出条件。比如当线程完成后,主进程自动退出等。追问

怎么设计主线程退出条件呢?
我是刚刚接触多线程编程,请问怎么用我程序中子线程的键盘监控来结束主线程呢?

追答

可以在主线程的循环里检查子线程的变量。可以弄一个全局变量。当子线程退出时,就写全局变量,主线程检查后就知道状态 了。 通常键盘监控放在主线程中,不会在子线程中。同样窗口图形操作中,键盘监控也会放在主线程。这是原则。 即使你勉强在子线程中实现了键盘监控也是不合理的。

追问

好的,谢谢你,我也想到了你说的这种方法,已经能够实现了。

但你说键盘监控放在子线程中不合理,请问关于这种编程思想与总体设计应该看什么书比较好呢?能否推荐一下。或者这需要实践经验的积累?

追答

实践啊。多练习就知道了。至于为什么 ,主要是因为键盘,屏幕,文件系统都是系统不能独占的资源,由操作系统统一管理。应用程序使用这些资源当然也是有限的。通常由主进程负责,其它线程只能受调度。后来渐渐成了规范。老版的操作系统则没有这个规范。

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答