Domanda

Mi piacerebbe sapere quando la mia applicazione è inattiva in modo che possa precaricare alcuni contenuti. C'è un evento o qualcosa di simile implementato in PyQt?

(potrei anche farlo con le discussioni, ma questo si sente come essere troppo complicato.)

È stato utile?

Soluzione

Hai almeno due opzioni diverse, è possibile utilizzare un filo o utilizzare un timer. Classe QThread di Qt fornisce una proprietà di priorità che è possibile impostare per renderlo unico processo quando non altri thread sono in esecuzione, che comprende il filo GUI. L'altra opzione è un singolo temporizzatore colpo. Un QTimer con un timeout di 0 millisecondi pone un evento sul retro della coda degli eventi in modo che tutti gli eventi e le funzioni sincrone già attivi o programmati saranno trattati prima.

Nel codice, le due opzioni sarà simile al seguente:

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

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

Se si va con il singolo colpo QTimer, fare attenzione a quanto elaborazione voi fate come si può ancora bloccare il Gui. Faresti probabile che vuole romperlo in pezzi in modo che GUI non si avvia ad essere in ritardo:

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

Ovviamente, quanto sopra è la sintassi C ++, ma per rispondere rispetto al PyQt, utilizzare il timer solo colpo. In Python, il globale blocco interprete è fondamentalmente andando a rendere gran parte della vostra concorrenza inutile se l'attuazione essere chiamato viene eseguita all'interno di Python.

È anche allora avete la scelta di utilizzare le discussioni Python o fili Qt, entrambi sono buone per motivi diversi.

Altri suggerimenti

Dai un'occhiata alla QAbstractEventDispatcher . Ma ... ho ancora suggerisco di utilizzare un filo. Motivi:

  1. Sarà portatile
  2. Se si commette un errore nel codice, il ciclo degli eventi sarà rotto -.> Si applicazione potrebbe bloccarsi, uscita tutto ad un tratto, etc
  3. Mentre il precarico accade, la vostra applicazione si blocca. Non ci sono eventi saranno trattati a meno che non si può precaricare il contenuto uno alla volta, sono tutti molto piccoli, di carico richiede solo pochi millesimi di secondo, ecc.

Con un filo e inviare un segnale al thread principale quando il contenuto è pronto. E 'molto più semplice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top