|
|
|
|
Strumenti |
01-01-2022, 18:06 | #1 |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 1680
|
[Python] Timer avviato in un thread mi chiude il programma allo scadere
Sto realizzando con l'ausilio di PyQT un tool che mi fa comodo al lavoro, si tratta di un programma che legge un file contenete GCODE, quindi coordinate per il movimento di una macchina CNC, e traccia su una QGraphicsScene questi movimenti. Nel tracciare questi movimenti calcola il fattore di scala per ingrandire o ridurre il disegno per adeguarsi alle dimensioni della scena.
Se dopo aver mostrato un tracciato ridimensiono la finestra dell'interfaccia, quindi cambiano anche le dimensioni della scena, e riclicco sul pulsante per elaborare il file GCODE, il tracciato viene ridisegnato con il fattore di scala adeguato. Ora vorrei rendere questa cosa automatica, ovvero al cambiare le dimensioni della scena, deve partire automaticamente la rielaborazione del tracciato. Per non farla partire continuamente quando ad esempio si trascina un bordo della finestra, ho pensato di introdurre un timer avviato appena la finestra cambia e si resetta se cambia ancora prima di 3 secondi. Se passano 3 secondi senza ridimensionamenti, viene avviata la rielaborazione. Riesco a fare quasi tutto, tranne per il fatto che allo scadere del timer parte la rielaborazione, ma prima che finisca viene chiuso il programma. Non ho messaggi d'errore nella console, né vengono sollevate eccezzioni. semplicemente il programma termina. Sono certo che c'entri il timer perché la rielaborazione manuale chiama esattamente la stessa funzione chiamata dal timer, e manualmente il programma non si chiude. Il codice completo lo potete leggere qui Indicazioni su dove andare a guardare sul codice A gestire tutto è la classe MainWindow, il metodo draw() è quello che viene chiamato alla pressione del pulsante "Elabora", con l'ausilio di altri metodi legge il contenuto del file GCODE (uno di prova è presente sul repository: TEST.PGR), preleva le coordinate utili e le mette in una lista di tuple, prepara le dimensioni della scena e il fattore di scala da usare, di seguito cicla sulla lista e traccia i vari segmenti che definiscono il tracciato. Il timer viene instanziato nel costruttore di MainWindow, viene avviato/resettato nel metodo resizeEvent() mediante il metodo timerManager(). Lo stop è invece gestito direttamente nel metodo run() della classe ResettableTimer(). Riuscite a capire per quale motivo l'uso del timer mi fa chiudere il programma? |
01-01-2022, 19:13 | #2 |
Member
Iscritto dal: Dec 2006
Messaggi: 33
|
Da ignorante: potrebbe essere causato dal fatto che la draw non viene eseguita nella eventloop di QT? (non ho visto il codice, ma se fosse già così non fare caso a questa osservazione)
|
01-01-2022, 21:57 | #3 |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 1680
|
Sì, il metodo draw() è eseguito all'interno dell'event loop.
|
01-01-2022, 22:01 | #4 |
Member
Iscritto dal: Dec 2006
Messaggi: 33
|
|
01-01-2022, 22:15 | #5 |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 1680
|
Per il mio livello di conoscenza sul tema, questa è una domanda non semplice.
Penso di aver capito cosa dici, sì, il metodo draw è chiamato da un thread appartenente ad una mia classe esterna alla quale viene passato da utilizzare come callback. Se questo fosse il problema, come istanzio il timer in un thread dell'event loop? |
01-01-2022, 22:23 | #6 |
Member
Iscritto dal: Dec 2006
Messaggi: 33
|
Usa un QTimer. Direi che questo fa al caso tuo:
https://stackoverflow.com/questions/...idgets-in-pyqt |
01-01-2022, 22:43 | #7 |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 1680
|
Ho abbozzato un po' di codice giusto perché si usasse il QTimer come mi hai suggerito e funziona, ora dovrò solo perfezionarne il funzionamento.
Grazie mille! |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:43.