Question

Je voudrais savoir quand mon application est inactive pour que je puisse précharger un certain contenu. Y at-il un événement ou quelque chose de similaire mis en œuvre PyQt?

(je pourrais aussi le faire avec des fils, mais cela se sent comme trop compliquée.)

Était-ce utile?

La solution

Vous avez au moins deux options différentes, vous pouvez utiliser un fil ou utiliser une minuterie. La classe QThread de Qt fournit une propriété de priorité que vous pouvez définir pour le rendre seul processus lorsqu'aucun autre fils sont en cours d'exécution, ce qui comprend le fil de l'interface graphique. L'autre option est un minuteur de prise de vue. A QTimer avec un délai de 0 millisecondes met un événement à l'arrière de la file d'attente d'événements de telle sorte que tous les événements et fonctions synchrones déjà actives ou programmées seront traitées en premier.

Dans le code, les deux options se présente comme suit:

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

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

Si vous allez avec le seul coup QTimer, faites attention combien vous faites le traitement que vous pouvez toujours bloquer l'interface graphique. Vous auriez probablement envie de le casser en morceaux de sorte que l'interface graphique ne démarre pas à la traîne:

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

De toute évidence, ce qui précède est C ++ syntaxe, mais pour répondre par rapport à PyQt, utilisez la seule minuterie de prise de vue. En Python, global de verrouillage de l'interpréteur va essentiellement à rendre une grande partie de votre inutile si la concurrence mise en œuvre étant appelé est effectuée à l'intérieur de python.

Vous avez également alors le choix d'utiliser des fils Python ou fils Qt, les deux sont bons pour des raisons différentes.

Autres conseils

Jetez un oeil à QAbstractEventDispatcher . Mais ... Je suggère toujours d'utiliser un fil. Motifs:

  1. Il sera portable
  2. Si vous faites une erreur dans votre code, la boucle d'événement sera cassé -.> Vous pouvez suspendre l'application, sortie tout d'un coup, etc
  3. Alors que le préchargement arrive, votre application se bloque. Aucun événement ne sera traité à moins que vous pouvez précharger le contenu d'un à la fois, ils sont tous très petits, le chargement ne prend que quelques millisecondes, etc.

Utilisez un fil et d'envoyer un signal au thread principal lorsque le contenu est prêt. Il est tellement plus simple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top