Я разрабатываю программу, которая использует DirectShow для захвата аудиоданных из
медиа файлы. DirectShow использует поток для передачи аудиоданных в обратный вызов
функция в моей программе, и я позволил этой функции обратного вызова вызвать другой
функция в Python.
Я использую Boost.Python, чтобы обернуть мою библиотеку, функция обратного вызова:
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);
}
};
Здесь возникает проблема, поток DirectShow вызывает мой
PythonCallback, а именно вызов функции в Python. Как только он звонит, мой
программа просто вылетает. Я обнаружил, что это должно быть проблемой с многопоточностью. Затем я
нашел этот документ:
http://docs.python.org/c-api/init.html
Кажется, что моя программа не может вызвать функцию Python из потока
напрямую, потому что есть глобальная блокировка интерпретатора. GIL питона
это так сложно, я понятия не имею, как это работает. Извини, что я могу сделать
это спросить. Мой вопрос Что я должен делать до и после звонка
Функция Python из потоков?
Может выглядеть так.
void operator() (double time, const AudioData &data) {
// acquire lock
m_Function(time, data);
// release lock
}
Спасибо.
Виктор Лин.