2016-05-16 1 views
-1

問題は、私は止めることはできないです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 

私はマウスの自動化プログラムを作り、私は方法(root.after(1000年、start_mouse))「の後に」Tkinterのと呼んで以下の機能を持っています(ボタンの後ろ)機能付きプロセス:

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

だから、すべてが正常に動作しているが、私はroot.destroyを呼び出すとき()私は2つのバックグラウンドプロセスが残っていますし、私のカーソルが約5秒間フリーズします。 誰もこれを処理する方法を知っていますか?

+0

あなた自身で 'WM_QUIT'を投稿することは許されておらず、' PostThreadQuitMessage() 'もありません。代わりに、他のプロセスのメインウィンドウに 'WM_CLOSE'を送信してみてください。 – andlabs

答えて

1

PostThreadMessageは、WM_QUITを送信する正しい方法ではありません。レイモンド・チェンはmore on thatです。テイクアウェイは、PostQuitMessageがスレッドのメッセージキュー(他の中でも)でフィルタリングをバイパスすることができるということです。 win32apiのPythonライブラリを見ると、その特定の呼び出しを行う必要がある関数PostQuitMessageがありますが、それは実際問題の解決ではありません。

実際には、個々のスレッドでメッセージループを実行する必要があるため、WM_QUITが入ってきて、それを適切に処理することができます。あなたがスレッド上でメッセージをポンピングしていない場合、ゾンビスレッドを残す終了メッセージを受け取ることはありません。

解決策は、彼らが突然終了することができる場合daemon threadsとしてあなたのワーカースレッドをマークするために、または自分自身後にクリーンアップする必要がある場合は、それが終了する時間ですスレッドを知らせるためにEventのようなものを使用することです。

関連する問題