Frage

Ich möchte wissen, wenn meine Anwendung inaktiv ist, so dass ich einige Inhalte vorspannen kann. Gibt es ein Ereignis oder etwas ähnliches implementiert in PyQt?

(ich kann es auch mit Themen, aber das fühlt sich an wie zu kompliziert zu sein.)

War es hilfreich?

Lösung

Sie haben mindestens zwei verschiedene Optionen können Sie einen Thread verwenden oder einen Timer verwenden. Qt QThread-Klasse stellt eine Priorität Eigenschaft, die Sie festlegen können, um es machen nur Prozess, wenn keine anderen Threads ausgeführt werden, die die GUI-Thread enthält. Die andere Option ist ein einziger Schuss-Timer. Ein QTimer mit einem Timeout von 0 Millisekunden legt ein Ereignis auf der Rückseite der Ereigniswarteschlange, so dass alle Ereignisse und synchrone Funktionen bereits aktiv oder geplant zuerst verarbeitet werden.

Im Code die beiden Optionen wie folgt aussehen:

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

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

Wenn Sie mit dem einzigen Schuss QTimer gehen, seien Sie vorsichtig, wie viel Verarbeitung Sie tun, wie Sie noch die Gui blockieren kann. Sie würden wahrscheinlich es in Stücke brechen wollen, so dass GUI nicht zu hinken beginnen:

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

Offensichtlich ist die obige C ++ Syntax, aber in Bezug auf PyQt, verwenden Sie das Single-Shot-Timer zu beantworten. In Python, die globale Interpreter Lock im Grunde viel von Ihrer Gleichzeitigkeit sinnlos, wenn die Umsetzung machen wird wurde in Python genannt wird durchgeführt.

Sie haben auch dann die Wahl der Themen oder Qt Threads Python verwenden, sind beide gut aus unterschiedlichen Gründen.

Andere Tipps

Hier finden Sie aktuelle QAbstractEventDispatcher . Aber ... Ich schlage vor, noch einen Thread zu verwenden. Begründung:

  1. Es ist tragbar
  2. Wenn Sie einen Fehler im Code zu machen, wird die Ereignisschleife gebrochen -.> Sie können app hängen, Ausfahrt ganz plötzlich, usw.
  3. Während die Vorbelastung der Fall ist, Ihre Anwendung hängt. Keine Ereignisse verarbeitet werden, wenn Sie den Inhalt einer nach dem anderen vorspannen kann, sie sind alle sehr klein, Laden nur wenige Millisekunden dauert, etc.

einen Thread verwenden und ein Signal an den Haupt-Thread zu senden, wenn der Inhalt bereit ist. Es ist so viel einfacher.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top