Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从另一个线程调用时未执行的语句_Python_Multithreading - Fatal编程技术网

Python 从另一个线程调用时未执行的语句

Python 从另一个线程调用时未执行的语句,python,multithreading,Python,Multithreading,一个简单的程序,我从某处提出来,它所做的只是注册一些全局键盘挂钩,对于全局热键,当热键函数被调用时,它会按预期工作。但是如果在另一个线程内调用热键函数,如下所示: t = threading.Thread(target=hotkeys) t.start() 然后,def handle_win_f3中的语句sys.exit、os.startfile os.environ['TEMP']、user32.PostQuitMessage 0不会立即执行,而是在一分钟或更长时间后执行。为什么?有解决办

一个简单的程序,我从某处提出来,它所做的只是注册一些全局键盘挂钩,对于全局热键,当热键函数被调用时,它会按预期工作。但是如果在另一个线程内调用热键函数,如下所示:

t = threading.Thread(target=hotkeys) 
t.start()
然后,def handle_win_f3中的语句sys.exit、os.startfile os.environ['TEMP']、user32.PostQuitMessage 0不会立即执行,而是在一分钟或更长时间后执行。为什么?有解决办法吗?做我正在做的事情的更好的方式

该方案:

import threading
import datetime
import os
import sys
import ctypes
from ctypes import wintypes
import win32con

HOTKEYS = {
    1 : (win32con.VK_F3, win32con.MOD_WIN),
    2 : (win32con.VK_F4, win32con.MOD_WIN)
}

def handle_win_f3 (): 
    print 'opening' #this works!
    os.startfile (os.environ['TEMP']) #this doesn't
    print 'opened'

def handle_win_f4 ():
    print 'exiting'
    sys.exit()
    user32.PostQuitMessage (0)

HOTKEY_ACTIONS = {
    1 : handle_win_f3,
    2 : handle_win_f4
}


def hotkeys():
    byref = ctypes.byref
    user32 = ctypes.windll.user32
    print "hotkeys"

    for id, (vk, modifiers) in HOTKEYS.items ():
        print "Registering id", id, "for key", vk
        if not user32.RegisterHotKey (None, id, modifiers, vk):
            print "Unable to register id", id

    msg = wintypes.MSG()
    while user32.GetMessageA (byref (msg), None, 0, 0) != 0:
        print 'looping'
        if msg.message == win32con.WM_HOTKEY:
            action_to_take = HOTKEY_ACTIONS.get(msg.wParam)
            print action_to_take
            if action_to_take:
                action_to_take ()

t = threading.Thread(target=hotkeys)

t.start()
#hotkeys()

谢谢

尝试将主线程置于睡眠状态,或者让它等待生成的线程。现在,在程序的末尾添加t.join。

尝试将主线程置于睡眠状态,或使其等待生成的线程。注意,在程序的末尾添加t.join。

sys.exit当从另一个线程运行时只会终止该线程。你到底想达到什么目的?如果要完全终止进程,请尝试操作系统。\u exit0sys.exit当从另一个线程运行时只终止该线程。你到底想达到什么目的?如果要完全终止进程,请尝试操作系统。\u exit0