Je développe un programme qui utilise DirectShow pour récupérer des données audio à partir de fichiers multimédias. DirectShow utiliser thread pour transmettre des données audio à la fonction de rappel dans mon programme, et je laisse cette fonction de rappel appeler une autre fonction en Python.Comment appeler une fonction python à partir d'un thread de langue étrangère (C++)
J'utilise Boost.Python pour wrapper ma bibliothèque, la fonction de rappel:
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);
}
};
vient ici le problème, un fil de DirectShow appelle mon PythonCallback, à savoir, appelez la fonction en Python. Une fois qu'il appelle, mon programme tombe en panne. J'ai trouvé que cela devrait poser problème. Ensuite, je trouvé ce document:
http://docs.python.org/c-api/init.html
Il semble que mon programme ne peut pas appeler à la fonction Python de fil directement, parce qu'il est global interprète Lock. Le GIL du python est si complexe, je n'ai aucune idée de comment cela fonctionne. Je suis désolé, ce que je peux faire est de demander. Ma question est. Que dois-je faire avant et après avoir appelé une fonction Python à partir de threads?
Cela peut ressembler à ceci.
void operator() (double time, const AudioData &data) {
// acquire lock
m_Function(time, data);
// release lock
}
Merci. Victor Lin.
Plus de documentation: http://docs.python.org/c-api/init.html#threads –