Если matplotlib в вашей программе использует бэкенд QT (который, как я полагаю, с тех пор, как вы вставляете его в приложение Qt), тогда рисунок будет выполнен в потоке, который вы вызываете командами matplotlib. Это будет проблемой, потому что Qt требует, чтобы весь рисунок делался из основного потока. Поэтому я уверен, что вы не можете это исправить. (если вы использовали GTK, вы можете использовать блокировку gtk, чтобы основной процесс не взаимодействовал с графическим интерфейсом, в то время как вы делали связанные с GUI вещи из своего потока, но Qt избавился от их аналогичной блокировки в версии 4 и выше).
У вас есть несколько вариантов:
QApplication.postEvent()
RemoteGraphicsView
. Это запустило бы второй процесс для интенсивно создаваемого процессора материала, который обойдет вышеупомянутую проблему PILON GIL. Ознакомьтесь с примерами, которые они предоставляют, если вы заинтересованы После небольшого исследования я считаю, что проблема заключалась в том, что прокси на сервере закрывал соединение после нескольких минут простоя, и клиент ManagedChannel не обнаружил это автоматически и снова подключился, когда это произошло. При создании ManagedChannel я добавил к нему idleTimeout, который будет предварительно уничтожать соединение, когда оно бездействует, и восстанавливать его, когда оно понадобится снова, и это, похоже, решает проблему. Таким образом, новая конструкция канала выглядит следующим образом:
@Singleton
@Provides
fun providesMyClient(app: Application): MyClient {
val channel = AndroidChannelBuilder
.forAddress("example.com", 443)
.overrideAuthority("example.com")
.context(app.applicationContext)
.idleTimeout(60, TimeUnit.SECONDS)
.build()
return MyClient(channel)
}