У меня есть библиотека, которая выполняет некоторые действия с аудио файлами. В целях тестирования я создал интерфейс Python (используя boost :: python) и теперь пытаюсь визуализировать некоторые данные.
Когда я попытался создать несколько графиков matplotlib, я столкнулся со следующей проблемой: если я читаю медиафайл с библиотекой, а затем вызываю matplotlib.pyplot.show()
Пользовательский интерфейс matplotlib зависает сразу после его появления: я вижу график, но не могу закрыть / изменить размер / взаимодействовать с окном, курсор мыши показывает «занятое колесо».
Я нашел строку, вызывающую это замораживание (если я return
на линию раньше show()
отлично работает и если retrun
на следующей строке show()
висит):
mReader = [[AVAssetReader alloc]initWithAsset:ass error:&mReaderError];
Итак, что происходит:
PyEval_SaveThread
)[[AVAssetReader alloc]initWithAsset]
называетсяPyEval_RestoreThread
)И матплотлиб виснет.
Я почти уверен, что сам код библиотеки в порядке (он протестирован и хорошо работает как на osx, так и на ios), но существует некоторый конфликт между использованием CoreAudio и «что-то в GUI».
Вот частичный след зависшего процесса:
frame #0: 0x00007fff8b778ef8 CoreFoundation`CFRunLoopRunSpecific + 440
frame #1: 0x00007fff8d7287b7 HIToolbox`ReceiveNextEventCommon + 479
frame #2: 0x00007fff8d7285bc HIToolbox`_BlockUntilNextEventMatchingListInModeWithFilter + 65
frame #3: 0x00007fff8e48524e AppKit`_DPSNextEvent + 1434
frame #4: 0x00007fff8e48489b AppKit`-[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 122
frame #5: 0x00007fff8e47899c AppKit`-[NSApplication run] + 553
frame #6: 0x00000001054b3fea _macosx.so`show + 218
frame #7: 0x00000001000997cc Python`PyEval_EvalFrameEx + 17823
frame #8: 0x000000010009d103 Python`fast_function + 203
Есть идеи что не так?
На самом деле это не ответ, а обходной путь. Это заставляет вещи работать, но слишком уродливо, чтобы быть окончательным решением.
Если используется интерфейс до AVAssetReader
все работает отлично. Я думаю, что-то правильно инициализируется в этом случае.
Этот код висит:
data = native_module.get_data_using_coreaudio()
plt.plot(data)
plt.show()
но это не
plt.plot([0])
plt.show()
plt.cla()
data = native_module.get_data_using_coreaudio()
plt.plot(data)
plt.show()