无意中堆叠循环

时间:2016-01-12 13:54:26

标签: python python-2.7 ros

我现在有一个程序,用于显示图像,并允许按键上的各种功能(例如,加载新帧,裁剪感兴趣的区域等)。它也设置为如果太多时间没有动作,它会自动尝试加载新图像。

def triggeredbytimer():
    global f, x1i, y1i, x2i, y2i, sid, keepgoing
    keepgoing = False
    print "Inactivity has lead to an automatic refresh. Loading newest image."
    f = 0; t = 0
    incoming = imagerequest(sid, f, t, x1i, y1i, x2i, y2i)
    imagecallback(incoming)

def imagecallback(data):
    print "----------------------- imagecallback"
    global sid, f, x1i, y1i, x2i, y2i, img, refPt, cropping, keepgoing
    keepgoing = True
    ########### \\// change this to change wait for autorefresh
    tmr = Timer(10.0, triggeredbytimer)
    tmr.start()
    ##################################
    b = data.b; t = data.tr; sid = data.sid; error = int(data.error)
    t = float(t); sid = int(sid)
    expandedt = time.strftime("%m-%d-%Y %H:%M:%S", time.localtime(t)) 
    print str(t) + " ----> " + expandedt
    print "----------------------- image incoming"
    timestr = time.strftime("%H:%M:%S", time.gmtime(t))
    print "Loaded image from %s."%timestr
    imagedata = bridge.imgmsg_to_cv2(b, "bgr8")
    npimg = cv2.imencode('.jpg', imagedata)
    cv2.imwrite('temp_image_np.jpg', imagedata)
    img = cv2.imread('temp_image_np.jpg')
    clone = img.copy()
    cv2.namedWindow('image', cv2.WINDOW_NORMAL)
    cv2.setMouseCallback("image", mouseclickcb)
    cv2.imshow("image", img)
    while keepgoing == True:
        key = cv2.waitKey(0) & 0xFF
        ## (here there are a lot of keypress functions, for brevity I included only one)
        elif key == ord("t"):
            print "Looking for newest frame..."
            tmr.cancel()
            t = 0; f = 0
            incoming = imagerequest(sid, f, t, x1i, y1i, x2i, y2i)
            imagecallback(incoming)

注意:图像是通过服务从ROS程序中获取的,这就是" imagerequest"函数的来源。所有这些都可以正常工作:问题是具体如规定。)

总结一下 - 由于此片段中有一些不相关的剪辑 - 图像由imagecallback加载。调用该函数时,计时器启动(时间限制是任意的,此处设置为低电平以进行测试)。当计时器到期时,triggeredbytime()请求新图像。它通过ROS服务获取图像,然后从中获取返回并将其用作imagecallback(数据)的输入,从而加载图像并允许所有按键功能仍然有效。

所以问题是每当程序刷新一个新帧时,while keepgoing == True循环不会停止,导致堆栈循环继续,每次刷新都会变得更糟。这导致单个按键执行多次,这很快就压倒了它从中拉出图像的程序。 (最初,这只是一段时间的真实:循环,但我添加了" keepgoing"变量以试图纠正这种情况 - 未成功,因为它。)我不知道如何解决这个问题问题,并尝试关闭循环"关闭"足以杀死第一个循环,但允许下一个循环执行到目前为止尚未解决。有没有办法退出这个,同时干净地保持==真正的循环,以防止事物堆叠,或者是否有更好的方法来解决在一定时间后加载新图像的问题?

谢谢!

编辑:要清楚,问题在于结束'而#39;当计时器达到0时循环。设置keepgoing = False似乎不起作用(可能是因为我无法返回'它),所以我需要类似的东西,如果它'可能......

0 个答案:

没有答案