come fermare il gestore di mouse di Windows in Python?

ho fatto un programma di automazione del mouse e ho la seguente funzione che chiamo con un metodo Tkinter “after” (root.after (1000, start _ mouse)

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

il problema è che non riesco a fermare il processo con una funzione (dietro un pulsante):

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

quindi tutto funziona bene, ma quando chiamo root.destroy () sono rimasto con due processi di sfondo e il mio cursore si blocca per circa 5 secondi. qualcuno conosce un senso maneggiare questo?

EN From: How to stop Windows mouse handler in Python?

More similar articles:

2 Comments

  1. non credo che ti sia permesso di pubblicare WM_QUIT te stesso, e non c’è PostThreadQuitMessage(). provare a inviare la finestra principale dell’altro processo a WM_CLOSE invece.

  2. PostThreadMessage non è il modo giusto per inviare un WM_QUIT. Raymond Chen ha di più su questo. il takeaway è che il PostQuitMessage può bypassare il filtraggio della coda dei messaggi del thread (tra le altre cose). Guardando la libreria python win32api, ha la funzione PostQuitMessage che è necessario fare quella chiamata particolare, ma non è davvero una soluzione al problema.

    in realtà sarebbe necessario essere in esecuzione un ciclo di messaggi sui singoli thread, in modo che possano vedere quando il WM_QUIT entra e trattare con esso in modo appropriato. se non state pompando i messaggi su un filetto, allora non otterrete mai il messaggio di arresto che li lascia con i filetti dello zombie.

    la soluzione è quella di contrassegnare i thread worker come thread daemon se possono essere interrotti bruscamente, o di usare qualcosa come un Evento per segnalare i thread che è il momento di chiudere se hanno bisogno di ripulire dopo se stessi.

Leave a Reply

Your email address will not be published. Required fields are marked *