python线程终止线程

本文偏向于个人总结而非技术总结,文中方法可以当做一种参考,但一定不唯一!

背景介绍

        我主要编写单线程python脚本,对于多线程知之甚少。我以为单线程的好处在于快、并且在哪里出错程序马上就会停下来,所以个人对于单线程还是颇为偏向的(一定不是因为我不会多线程!!)。直到某天我遇到了模拟键鼠操作的需求,需要根据excel中的内容去一个点击一个界面,并且将结果返回excel中,这个需求难以对做出的操作进行判断,也就是说假如你的电脑突然弹出了一个广告?弹窗?这些都可能诱发未知的错误。并且无法判断操作,就意味着他不会因为报错而停止,而是接着往下跑,可能导致接下的操作全部变形,那么此时就需要通过外界力量来干涉程序使其停下。

结构

        GUI---按扭----按钮启动主程序

思路

        点击按钮启动主程序的同时开启事件监听程序,当监听到某一键盘按键时终止程序。

        但是线程似乎并不能直接结束另一线程。

        那么似乎只能直接关闭python了。

开始尝试

        启动程序,打开任务管理器,发现程序在后台是这种结构。

        xxx(打包出来的exe名)- xxxx(gui标题)

尝试1

        两个代码都是通过窗口的按钮启动,那么可否通过关闭窗口来终止线程呢?

    def on_release(self, key):
        print("已经释放:", format(key))

        if key == Key.esc:
            self.kill_name('xxxx')
            sys.exit()

    def kill_name(self, name):
        pids = psutil.pids()
        for pid in pids:
            p = psutil.Process(pid)
            if p.name() == name:
                cmd = r'taskkill /F /IM ' + name
                os.system(cmd)

    def start_listen(self):

        Listener(on_release=self.on_release).start()

    def listening(self):
        self.start_listen()

        答案是不行的,当我尝试关闭窗口时,窗口会变成xxxx(未响应),而主程序则是继续运行,猜测是因为主程序未关闭,所以导致窗口也无法关闭。

尝试2(√)

        在打包exe时附带cmd窗口,监听事件关闭cmd窗口已达到停止程序的目的,经实践可行。

但是太丑了,所以方案被淘汰。

尝试3以及新的问题以及解决(√)

        直接关闭xxx(打包出的exe),经实践证明可行。

        但是又出现了新的问题,我根据要求增加了操作,在退出程序的时候将我在后台打开的东西都给关闭了,不留下垃圾,但是由于是直接关闭,excel的数据自然是没有保存的。当我尝试将excel设为全局变量,在监听时先保存excel在关闭时,又报了一个新的错误。

python线程终止线程_第1张图片

他说我的excel被另一线程(主程序)占用了无法操作 ,也就是说我只能在主程序中对excel进行保存与退出的操作,那我瞬时就想到了一个方法,那就是设计一个全局变量作为标记值,然后在主程序设置多个checkpoint,监听事件会更改标记值,当check到标记值改变的时候对excel进行保存退出,以及退出程序的操作。

缺点很明显了,

(一)在主程序中加入大量的if判断很显然会影响到效率

(二)代码观赏性降低了

(三)更改代码的时候挺痛苦的,隔几行就要插入一次判断函数

 

你可能感兴趣的:(小练习,开发语言,python)