Python QR扫码器未检测到码5秒退出、检测后等待处理完成再退出的实现问题
二维码扫描脚本超时逻辑修复方案
问题根因
你当前的逻辑是主进程不感知子进程状态,等待5秒后直接强制终止子进程,所以即便已经识别到二维码进入处理流程,也会被打断。我们可以通过多进程的Event通信机制实现状态同步,让主进程感知到子进程已经进入处理流程,就不再执行强制终止逻辑,等待子进程处理完成后自然退出。
修复后完整代码
import cv2 import numpy as np from pyzbar.pyzbar import decode from multiprocessing import Process, Event import time def decoder(image, scan_success_event): gray_img = cv2.cvtColor(image,0) barcode = decode(gray_img) for obj in barcode: # 识别到二维码,第一时间通知主进程取消超时终止逻辑 scan_success_event.set() points = obj.polygon (x,y,w,h) = obj.rect pts = np.array(points, np.int32) pts = pts.reshape((-1, 1, 2)) barcodeData = obj.data.decode("utf-8") barcodeType = obj.type string = str(barcodeData) cv2.destroyAllWindows() # 替换为你自己的processMyQRCode处理逻辑 i = 0 while i < 10: print("processing code for " + str(i) + " seconds") i += 1 time.sleep(1) print(string + " is processed") exit() def open_scanner(scan_success_event): # 树莓派运行时删除cv2.CAP_DSHOW参数 cap = cv2.VideoCapture(0 , cv2.CAP_DSHOW) while True: ret, frame = cap.read() decoder(frame, scan_success_event) cv2.imshow('My Title', frame) code = cv2.waitKey(1) if code == ord('q'): exit() if __name__ == '__main__': # 初始化扫码成功事件作为进程间通信标记 scan_success = Event() action_process = Process(target=open_scanner, args=(scan_success,)) action_process.start() # 等待5秒扫码窗口期 action_process.join(timeout=5) # 仅未扫码成功的场景下才终止进程,已扫码成功则等待处理完成后自然退出 if not scan_success.is_set(): action_process.terminate() else: action_process.join()
核心修改点
- 导入多进程的
Event类作为进程间通信的信号标记 - 识别到二维码后第一时间触发
Event信号,告知主进程无需执行超时终止逻辑 - 主进程等待5秒后先检查信号状态,未收到信号说明无二维码,直接终止进程;收到信号则持续等待子进程处理完成后再退出
内容的提问来源于stack exchange,提问作者lennert_h
相关产品推荐
相关产品推荐

