|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
[code]import threading
from pynput.mouse import Listener
x_list = []
y_list = []
def on_click(x, y, button, pressed):
global x_list,y_list
print("鼠标位置为:{},执行操作为:{},是否点击或松开:{}".format((x, y), button, pressed))
if pressed == True:
x_list.append(x)
y_list.append(y)
print(x_list)
def ls_k_thread():
with Listener(on_click=on_click) as listener:
listener.join()
def analyse_pic_thread():
r = threading.Thread(target=ls_k_thread)
r.start()
analyse_pic_thread()
print(x_list)
关于函数值赋给列表的问题
您的代码存在一个问题:在主线程打印 x_list 的时候,可能会出现列表为空的情况。这是因为 on_click 函数运行在一个单独的线程中,并且在主线程打印 x_list 之前,子线程没有足够的时间将数据添加到列表中。
解决这个问题的方法是,使用互斥锁(mutex lock)来确保在访问共享的 x_list 和 y_list 时的线程安全。
下面是修改后的代码:
- import threading
- from pynput.mouse import Listener
- x_list = []
- y_list = []
- mutex = threading.Lock() # 创建互斥锁
- def on_click(x, y, button, pressed):
- global x_list, y_list
- print("鼠标位置为:{}, 执行操作为:{}, 是否点击或松开:{}".format((x, y), button, pressed))
-
- if pressed:
- mutex.acquire() # 获取锁
- try:
- x_list.append(x)
- y_list.append(y)
- print(x_list)
- finally:
- mutex.release() # 释放锁
- def ls_k_thread():
- with Listener(on_click=on_click) as listener:
- listener.join()
- def analyse_pic_thread():
- r = threading.Thread(target=ls_k_thread)
- r.start()
- analyse_pic_thread()
- # 主线程暂时休眠1秒钟,以等待子线程将数据添加到列表中
- time.sleep(1)
- # 打印结果(注意:子线程可能仍在运行,列表可能会继续增加)
- print(x_list)
复制代码
在上述代码中,我们添加了一个互斥锁 mutex,并在访问 x_list 和 y_list 时使用 mutex.acquire() 获取锁,在访问结束后使用 mutex.release() 释放锁。这样可以确保在修改列表时只有一个线程进行操作,从而避免了数据竞争和不一致的问题。
另外,在主线程打印 x_list 前,我们使用 time.sleep(1) 让主线程暂停1秒钟,以等待子线程将数据添加到列表中。
希望以上修改能够解决您的问题。如果还有其他问题,请随时提问。
球一个最佳答案谢谢啦!这对我非常重要! 
|
|