У вас есть как минимум два разных варианта, вы можете использовать поток или использовать таймер. Класс QThread Qt предоставляет свойство приоритета, которое вы можете установить, чтобы он работал только тогда, когда другие потоки не запущены, включая поток GUI. Другой вариант - таймер одиночного выстрела. QTimer с тайм-аутом 0 миллисекунд помещает событие в конец очереди событий, так что все события и синхронные функции, уже активные или запланированные, будут обработаны первыми.
В коде эти две опции будут выглядеть следующим образом:
// (1) use idle thread processing
MyQThreadSubclass idleThread;
idleThread.run(QThread::IdlePriority);
// (2) use QTimer::singleShot
QTimer::singleShot(0, receiver, SLOT(doIdleProcessingChunk));
Если вы используете QTimer для одиночного выстрела, будьте осторожны, сколько обработки вы делаете, поскольку вы все еще можете заблокировать графический интерфейс. Вы, вероятно, захотите разбить его на куски, чтобы графический интерфейс не начинал отставать:
// slot
void doIdleProcessingChunk() {
/* ... main processing here ... */
if (chunksRemain())
QTimer::singleShot(0, receiver, SLOT(doIdleProcessingChunk));
}
Очевидно, что выше приведен синтаксис C ++, но для ответа по отношению к PyQt используйте таймер одиночного выстрела. В Python глобальная блокировка интерпретатора 1010 * в основном сделает бессмысленной большую часть вашего параллелизма, если вызываемая реализация выполняется в Python.
У вас также есть выбор использования потоков Python или потоков Qt, оба хороши по разным причинам.