2012-07-17 40 views
0

我試圖將一個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此功能。

+0

您不清楚「停止回調」是什麼意思?你能分享你用來嘗試這個的代碼嗎?請注意,您已將GIL鎖定在此處(如您應該那樣)。 「停止回調」涉及到運行Python代碼嗎?如果是這樣,它將被GIL阻止。 – 2012-07-17 13:54:00

回答

2

你說:「如果python回調函數短,相機庫函數能夠停止回調」。

我想知道庫是否無法在運行(或掛起?)時刪除回調。

如果回調短,有些時候它沒有運行(或沒有掛起),所以庫可以刪除它,但是如果回調很長,它正在運行(或正在等待)幾乎所有的時間,所以圖書館沒有機會將其刪除。

+0

我認爲你是對的。那麼問題是,如何讓圖書館去除回調。我猜GIL鎖必須從C代碼中以某種方式破解?有沒有辦法做到這一點? – katrasnikj 2012-07-17 21:31:36

+0

您可否修改回調函數使其可以短路?例如,當你要刪除回調時,用'if stops:return'開始並執行'stops = True'。 – MRAB 2012-07-17 21:50:34

+0

我想我可以這樣做,雖然它似乎有點黑客。我會讓你知道它是怎麼回事。 – katrasnikj 2012-07-18 22:37:32