我試圖將一個C++相機幀採集庫包裝到Python中。我遇到了回調函數的問題。我稱之爲從C函數Python函數用下面的代碼: 無法停止從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此功能。
您不清楚「停止回調」是什麼意思?你能分享你用來嘗試這個的代碼嗎?請注意,您已將GIL鎖定在此處(如您應該那樣)。 「停止回調」涉及到運行Python代碼嗎?如果是這樣,它將被GIL阻止。 – 2012-07-17 13:54:00