Python 在循环时无意中堆叠

Python 在循环时无意中堆叠,python,python-2.7,ros,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

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

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循环都不会停止,从而导致层叠循环继续进行,并且每次刷新都会变得更糟。这会导致一个按键执行多次,这会很快淹没它从中提取图像的程序。(最初,这只是暂时正确的:loop,但我添加了“keepgoing”变量来尝试纠正这种情况——事实上没有成功。)我不确定如何解决这个问题,尝试关闭循环足够长的时间以杀死第一个循环,但允许下一个循环执行到目前为止还没有成功。当keepgoing==True循环时,是否有任何方法可以干净地退出此循环,以防止事物堆积成这样,或者是否有更好的方法来解决在一定时间后加载新图像的问题

谢谢


编辑:需要明确的是,问题在于当计时器点击0时结束“while”循环。设置keepgoing=False似乎不起作用(可能是因为我无法“返回”它),因此,如果可能的话,我需要类似的东西…

您可以在imagecallback中添加第二个参数,告诉它在将keepgoing设置为false之前应该运行多长时间或多少次。但是如果我希望它无限期地运行,直到计时器启动或按下某个键为止,这会起作用吗?所以您希望它持续运行,直到发生事件为止会发生,但你不想让它运行得太频繁?同样的解决方案,只需添加变量并让它等待x次,这样循环每N次执行一次。更好的方法是让它在任意时间内休眠,然后执行,或者在事件发生时中断。我不确定如何按照您描述的方式运行它。将while替换为for(在范围内),并在变量到达末尾之前对其自身进行迭代重置?为imagecallback(数据,x)添加第二个参数,并在while循环下添加:if count