Lock()中的acquire()和release()都可以用Condition()中的来替代
除了提供与 Lock
类似的 acquire()
和 release()
方法外,还提供了 wait()
和 notify()
方法
condition()分生产池和消费池,生产池可以是个While True的thread,要获取生产池的值,给到消费池,需要在生产池中
self.buf_lock.acquire()
self.array = img_buff #要获取的值
self.buf_lock.notify()
self.buf_lock.release()
在消费池中,
with self.buf_lock:
self.buf_lock.wait()
return self.array
condition.wait()
使线程进入等待状态,直到其他线程发出信号(通过 condition.notify()
)来唤醒它。
如果不加wait的话,主线程和子线程就是同时运行的,会取不到子线程中我们要取的值
GPT的解答:
1. 在 CameraOperation 类中初始化一个 Condition 对象:
self.cond = threading.Condition()
2. 在 Work_thread 中,在图像处理完成后,通过 acquire() 获取锁,然后调用 notify() 发送信号通知其他线程:
self.cond.acquire()
self.array = img_buff
self.cond.notify()
self.cond.release()
3. 在 Trigger_once 中,等待信号的到来,获取 self.array=img_buff 的内容:
while self.array is None:
self.cond.acquire()
self.cond.wait()
self.cond.release()
通过这种方式,Trigger_once 将会在 Work_thread 处理完图像后才会获取 self.array=img_buff 的内容,避免了数据尚未准备好的情况发生。
实际使用,这两部分代码功能一致:
# def Trigger_once(self):
# if self.b_open_device:
# self.buf_lock.acquire()
# self.obj_cam.MV_CC_SetCommandValue("TriggerSoftware")
# self.buf_lock.wait()
# self.buf_lock.release()
# return self.array
# 软触发一次
def Trigger_once(self):
if self.b_open_device:
self.obj_cam.MV_CC_SetCommandValue("TriggerSoftware")
with self.buf_lock:
self.buf_lock.wait()
return self.array