0

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から呼び出します。

4

1 に答える 1

2

「Pythonコールバック関数が短い場合、カメラライブラリ関数はコールバックを停止できます」と言います。

ライブラリが実行中(または保留中)にコールバックを削除できないかどうか疑問に思います。

コールバックが短い場合は、実行されていない(または保留されていない)期間があるため、ライブラリはコールバックを削除できますが、コールバックが長い場合は、実質的にすべてのコールバックが実行されています(または保留中です)。時間なので、ライブラリはそれを削除する機会がありません。

于 2012-07-17T19:50:54.050 に答える