Ich entwickle ein Programm, das DirectShow verwendet, um Audiodaten aus Mediendateien. DirectShow verwendet einen Thread, um Audiodaten an die Callback Funktion in meinem Programm zu übergeben, und ich lasse diese Callback-Funktion eine andere Funktion in Python aufrufen.
Ich verwende Boost.Python, um meine Bibliothek zu verpacken, die Callback-Funktion :
class PythonCallback {
private:
object m_Function;
public:
PythonCallback(object obj)
: m_Function(obj)
{}
void operator() (double time, const AudioData &data) {
// Call the callback function in python
m_Function(time, data);
}
};
Hier kommt das Problem, ein Thread von DirectShow ruft meine PythonCallback, nämlich die Funktion in Python auf. Sobald er aufruft, wird mein Programm einfach abstürzen. Ich fand heraus, dass dies ein Threading-Problem sein sollte. Dann habe ich dieses Dokument gefunden:
http://docs.python.org/c-api/init.html
Es scheint, dass mein Programm nicht zu Python-Funktion von Thread aufrufen kann direkt aufrufen, weil es eine globale Interpreter-Sperre gibt. Die GIL von Python ist so komplex, dass ich keine Ahnung habe, wie sie funktioniert. Es tut mir leid, was ich tun kann ist zu fragen. Meine Frage ist. Was sollte ich tun, bevor und nachdem ich eine Python-Funktion aus Threads aufrufen?
Das kann folgendermaßen aussehen.
void operator() (double time, const AudioData &data) {
// acquire lock
m_Function(time, data);
// release lock
}
Danke. Victor Lin.