2016-05-16 71 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的東西來指示線程是否應該退出,如果需要自行清理。