Может быть возможно выделить немного памяти в python, а затем передать указатель на ваш код C ++, чтобы он мог выгружать данные прямо там.
рабатываю программу, которая использует 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 настолько сложен, что я понятия не имею, как он работает. Извините, я могу спросить. Мой вопрос Что я должен делать до и после вызова функции Python из потоков?
Это может выглядеть так
void operator() (double time, const AudioData &data) {
// acquire lock
m_Function(time, data);
// release lock
}
Благодарю. Виктор Лин.