Pergunta

Eu gostaria de saber quando meu aplicativo está ocioso para que eu possa pré-carregar algum conteúdo. Existe um evento ou algo semelhante implementado em PyQt?

(eu poderia também fazê-lo com threads, mas isto parece ser muito complicado.)

Foi útil?

Solução

Você tem pelo menos duas opções diferentes, você pode usar um fio ou usar um timer. classe QThread do Qt fornece uma propriedade de prioridade que você pode definir para fazer isso só processar quando não houver outros tópicos estão em execução, que inclui o segmento de GUI. A outra opção é um único temporizador tiro. A QTimer com um tempo limite de 0 milissegundos coloca um evento na parte de trás da fila de eventos para que todos os eventos e funções síncronos já ativas ou programadas serão processadas em primeiro lugar.

No código, as duas opções seria parecido com o seguinte:

// (1) use idle thread processing
MyQThreadSubclass idleThread;
idleThread.run(QThread::IdlePriority);

// (2) use QTimer::singleShot
QTimer::singleShot(0, receiver, SLOT(doIdleProcessingChunk));

Se você entrar com o único tiro QTimer, ter cuidado quanto processamento você faz como você ainda pode bloquear o Gui. Você provavelmente iria querer quebrá-lo em pedaços para que GUI não vai começar a lag:

// slot
void doIdleProcessingChunk() {
    /* ... main processing here ... */
    if (chunksRemain())
        QTimer::singleShot(0, receiver, SLOT(doIdleProcessingChunk));
}

Obviamente, o acima é sintaxe C ++, mas a resposta com relação a PyQt, use o timer único tiro. Em Python, o bloqueio intérprete mundial é basicamente vai tornar muito do seu sentido de simultaneidade se a implementação sendo chamada é realizada dentro Python.

Você também, em seguida, tem a opção de usar tópicos Python ou tópicos Qt, ambos são bons por razões diferentes.

Outras dicas

Tenha um olhar em QAbstractEventDispatcher . Mas ... eu ainda sugiro usar um fio. Razões:

  1. Será portátil
  2. Se você cometer um erro em seu código, o ciclo de eventos será quebrado -.> Você aplicativo pode travar, sair de repente, etc
  3. Embora o pré-carregamento acontece, seus trava aplicativo. Nenhum evento será processado a menos que você pode pré-carregar o conteúdo de cada vez, todos eles são muito pequenos, carregamento leva apenas alguns milissegundos, etc.

Use um fio e enviar um sinal para o segmento principal quando o conteúdo está pronto. É muito mais simples.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top