Como chamar uma função python de um segmento de idioma estrangeiro (C ++)
Estou desenvolvendo um programa que usa o DirectShow para capturar dados de áudio de arquivos de mídia. O DirectShow usa thread para passar dados de áudio para a função de retorno de chamada no meu programa, e eu deixei essa função de retorno de chamada chamar outra função no Python.
Eu uso o Boost.Python para envolver minha biblioteca, a função de retorno de chamada:
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);
}
};
Aí vem o problema, um thread do DirectShow chama meu PythonCallback, ou seja, chama a função no Python. Uma vez chamado, meu programa simplesmente falha. Achei que isso deveria ser um problema de segmentação. Então eu encontrei este documento:
http://docs.python.org/c-api/init.html
Parece que meu programa não pode chamar a função do Python diretamente do thread, porque existe o Global Interpreter Lock. O GIL do python é tão complexo que não faço ideia de como ele funciona. Sinto muito, o que posso fazer é perguntar. Minha pergunta é. O que devo fazer antes e depois de chamar uma função Python a partir de threads?
Pode parecer com isso.
void operator() (double time, const AudioData &data) {
// acquire lock
m_Function(time, data);
// release lock
}
Obrigado. Victor Lin.