为何python多线程程序在末尾添加input()能运行,不添加就不能运行
程序简介:该程序包含两个线程,一个线程就是不断的循环print一个递增的数,另一个线程就是监控键盘,如果键盘按下F12,则两个线程都停止。出现的情况:1.这个程序在pyt...
程序简介:
该程序包含两个线程,一个线程就是不断的循环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文件运行,如果没有这一句则不能运行 展开
该程序包含两个线程,一个线程就是不断的循环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文件运行,如果没有这一句则不能运行 展开
1个回答
展开全部
因为你没有考虑主进程。主进程不如果不等待线程,自己先退出来了。操作系统会自动清空你的线。
所以这里要有一个input,其实你不用input而是用
while True:
time.sleep(1.0)
这样也是可以的。 就是让主进程等待。
你还可以设计主进程退出条件。比如当线程完成后,主进程自动退出等。
所以这里要有一个input,其实你不用input而是用
while True:
time.sleep(1.0)
这样也是可以的。 就是让主进程等待。
你还可以设计主进程退出条件。比如当线程完成后,主进程自动退出等。
更多追问追答
追问
怎么设计主线程退出条件呢?
我是刚刚接触多线程编程,请问怎么用我程序中子线程的键盘监控来结束主线程呢?
追答
可以在主线程的循环里检查子线程的变量。可以弄一个全局变量。当子线程退出时,就写全局变量,主线程检查后就知道状态 了。 通常键盘监控放在主线程中,不会在子线程中。同样窗口图形操作中,键盘监控也会放在主线程。这是原则。 即使你勉强在子线程中实现了键盘监控也是不合理的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询