2016-05-16 95 views
-1

我由鼠标自动化程序和我有以下功能,其I“后”的方法(root.after(1000,start_mouse))如何停止Python中的Windows鼠标处理程序?

def start_mouse(): 
    """Staring the mouse click recording""" 
    global root, FLAG, CLICKS, T, q, timeList, clickThreadId 
    q = Queue.Queue() 
    threading.Thread(target=stack).start() 
    clickThreadId = win32api.GetCurrentThreadId() 

    def onclick(event): 
     """Mouse handler""" 
     global timeList, T, FLAG, q 
     timeList.append(int(round(time.time() * 1000))) 
     Tt = timeList[-1] - timeList[-2] 

     print event.Position[0],event.Position[1], Tt 
     if FLAG == 2: 
      temp_l =str(event.Position[0])+","+str(event.Position[1])+","+str(Tt)+"\n" 
      q.put_nowait(str("x: "+str(event.Position[0])+" "+"y: "+str(event.Position[1])+" "+"t: "+str(Tt)+"\n")) 
      CLICKS.append(temp_l) 
     return True 

问题是我不能阻止与Tkinter的调用与(后面的按钮)功能的过程:

win32api.PostThreadMessage(clickThreadId, win32con.WM_QUIT, 0, 0) 

所以一切工作正常,但是当我打电话root.destroy()我留下了两个后台进程和我的光标冻结约5秒钟。 有没有人知道处理这个问题的方法?

+0

我不认为你可以自己发布'WM_QUIT',并且没有'PostThreadQuitMessage()'。尝试将其他进程的主窗口改为“WM_CLOSE”。 – andlabs

回答

1

PostThreadMessage不是正确的方式发送WM_QUIT。 Raymond Chen有more on that。结论是PostQuitMessage可以绕过线程的消息队列(除其他之外)的过滤。看看win32api python库,它确实有你需要做这个特定调用的PostQuitMessage函数,但这不是真正的解决方案。

你实际上需要在各个线程上运行一个消息循环,以便他们可以看到何时WM_QUIT进来并正确处理它。如果你不是在一个线程上输出消息,那么你永远不会得到离开你的僵尸线程的退出消息。

解决的办法是将工作线程标记为daemon threads,如果它们可以突然终止,或者使用类似于Event的东西来指示线程是否应该退出,如果需要自行清理。