Как узнать, когда PyQt-приложение бездействует? - PullRequest
1 голос
/ 11 мая 2009

Я хотел бы знать, когда мое приложение бездействует, чтобы я мог предварительно загрузить некоторый контент. В PyQt реализовано событие или нечто подобное?

(я мог бы также сделать это с потоками, но это кажется слишком сложным.)

Ответы [ 2 ]

3 голосов
/ 11 мая 2009

У вас есть как минимум два разных варианта, вы можете использовать поток или использовать таймер. Класс 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, оба хороши по разным причинам.

1 голос
/ 11 мая 2009

Посмотрите на QAbstractEventDispatcher . Но ... Я все еще предлагаю использовать тему. Причины:

  1. Это будет портативный
  2. Если вы допустите ошибку в своем коде, цикл событий будет прерван -> Приложение может зависнуть, внезапно завершить работу и т. Д.
  3. Пока происходит предварительная загрузка, ваше приложение зависает. События не будут обрабатываться, если вы не можете предварительно загрузить контент по одному, все они очень малы, загрузка занимает всего несколько миллисекунд и т. Д.

Используйте поток и отправьте сигнал основному потоку, когда контент будет готов. Это намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...