无法从python C扩展中停止python回调

时间:2012-07-17 13:38:03

标签: c++ python c callback

我正在尝试将C ++相机帧采集库包装到Python中。我遇到了回调函数的问题。我用C函数调用python函数,代码如下:

PyGILState_STATE gstate;
gstate = PyGILState_Ensure();
result = PyObject_CallObject(my_callback, arglist);
if(result == NULL){
    caller.stopLive();
}
Py_DECREF(result);
Py_DECREF(arglist);
PyGILState_Release(gstate);

回调正常。当我尝试使用相机库函数停止回调时出现问题。如果python回调函数很短,则相机库函数可以停止回调,但是如果python回调函数需要更长时间,则相机库函数无法停止回调并且程序冻结。

有没有人有类似的问题?你有什么建议尝试吗?

编辑: 停止回调的代码是:

static PyObject * stopcallback(PyObject *self, PyObject *args)
{
    if(grabber->isListenerRegistered(pListener)){
        grabber->removeListener(pListener);
        while(grabber->isListenerRegistered(pListener)){
            Sleep(0);
        }
        delete pListener;
        printf("Callback stopped\n");
        Py_RETURN_NONE;
    }
}

我从Python调用此函数。

1 个答案:

答案 0 :(得分:2)

你说“如果python回调函数很短,相机库函数就可以停止回调”。

我想知道库在运行时是否无法删除回调(或挂起?)。

如果回调很短,有一段时间它没有运行(或没有挂起),所以库可以删除它,但如果回调很长,它正在运行(或正在等待)几乎所有时间,因此图书馆没有机会删除它。