Non capendo il concetto di come rendere la mia applicazione GUI

4

Sto facendo un programma che si occupa principalmente di estrazione e analisi di dati pesanti. Si tratta principalmente di un algoritmo di tipo back-end, senza elementi GUI o finestre della console visti durante l'esecuzione. Occasionalmente, tuttavia, sarà necessario rappresentare graficamente qualcosa o ottenere input molto speciali dall'utente. Tuttavia, inizialmente non volevo creare l'applicazione integrata nella GUI poiché ritengo che sarebbe eccessivamente complicata. Invece, volevo semplicemente rendere il mio algoritmo separato da qualsiasi elemento della GUI, e se erano necessari, quindi generare i loro in, fanno il loro lavoro, e poi escono; sono aggiunte al programma base, non necessarie per il suo funzionamento.

Quindi, la conclusione logica è che la mia elaborazione dei dati avviene nel thread principale, e la mia GUI occupa un altro thread quando necessario. Perché ho bisogno di due thread? Perché la GUI mi richiede di eseguire un ciclo di eventi in modo che tutto rimanga sotto controllo.

L'utilità grafica / GUI che ho scelto per questa attività è PyQt5, ma dovrebbe essere oltre al punto (la maggior parte di questi ha la stessa meccanica di base).

Si scopre però che agli elementi della GUI non piace essere eseguiti in un thread non principale ( vedi qui ). È possibile, come puoi vedere qui , ma la comunicazione dal thread principale e dal thread secondario è sgradevole. Non devo passare le informazioni tanto quanto devo interagire effettivamente con i metodi dell'oggetto della GUI. Non devo fare alcuna manipolazione effettiva dei widget della GUI da un altro thread, basta accedere ai metodi non GUI che appartengono all'oggetto della GUI.

Questo deve essere un progetto comune, ma non ho idea di come implementarlo. Tieni presente che, quando dico "elaborazione dati", è molto più complicato di così. Così, costruendo una GUI attorno ad esso, e avere tutto ciò che viene fatto all'interno di segnali e slot sembra renderlo un immenso casino.

Quindi ecco le domande generali. Non sto cercando codice, ma piuttosto indicatori generali.

  1. Come progetteresti un programma come questo?

  2. Come sarebbe ogni thread?

  3. Come interagiscono in un modo che non fa arrabbiare la GUI?

posta Nick Pandolfi 16.08.2016 - 00:02
fonte

2 risposte

1

Per prima cosa. I moderni sistemi operativi e persino i linguaggi di programmazione consentono la manipolazione della GUI solo dal thread principale. Per molti motivi questo è un must assoluto e in effetti è difficilmente un'opzione.

Quindi, le preoccupazioni che stai descrivendo sono state risolte sviluppando applicazioni sotto modelli di progettazione. Ci sono molti approcci qui con i più popolari modelli MVP, MVC e MVVM. Tutti consentono di separare il modello (il recupero e la manipolazione dei dati) da cosa e come si presentano le cose all'utente.

    
risposta data 16.08.2016 - 18:02
fonte
2

Ci sono diversi approcci possibili, e per ottenere la GUI / calcolo con il diritto di multithreading, ci sarà più bisogno di alcuni paragrafi qui su "I programmatori" possono insegnare ai tuoi.

Tuttavia, la prima cosa che vorrei in genere è: hai davvero bisogno di multithreading ? Dal momento che stai scrivendo un programma che si occupa principalmente di estrazione e analisi di dati pesanti, suppongo ci sia un database disponibile. Il programma di data mining può essere eseguito in un unico processo, senza GUI e il programma della GUI in un processo separato. La comunicazione tra processi potrebbe essere eseguita utilizzando il DB. In questo modo, potrebbe essere possibile evitare qualsiasi necessità di multithreading nella GUI.

In tal modo, puoi mantenere una strong separazione tra la parte di elaborazione e la parte della GUI, la parte di elaborazione non verrà mescolata con nessuna meccanica segnale / slot e non è nemmeno obbligatorio utilizzare Python per la parte della GUI ( ma se ti piace, puoi ancora.)

    
risposta data 16.08.2016 - 10:04
fonte

Leggi altre domande sui tag