python多线程程序在末尾添加input()能运行,不添加就不能运行,求大神!

CodeChangeWorld 发布于 2014/05/21 13:02
阅读 1K+
收藏 0

程序简介:

该程序包含两个线程,一个线程就是不断的循环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文件执行,如果没有则一句,双击py文件则不行

 

 

加载中
0
0xAB
0xAB

很明显,你新建的这两个线程不在主线程生命周期内。所以,主线程关闭了,你新建的线程也会被强制关闭。

解决方法:

使用高一级的线程封装threading.Thread

启动线程后,调用th.join()方法


返回顶部
顶部