Come interrupt selezionare / pselect esecuzione in QThread
Domanda
Ho un QThread che legge da una presa di corrente e invia un (segnale QT) segnale quando ci sono dati disponibili. Questo sarebbe facile con lettura bloccante (2), ma devono essere in grado di fermare il filo dall'esterno senza attendere troppo a lungo.
Se dovessi usare pthread userei pselect e pthread_kill(thread_id, some_signal)
, ma non lo fa QThread
sembra avere metodi simili. E l'aggiunta di un dependcy su pthread a questo progetto non sembra elegante.
Anche io non voglio usare altri metodi brutto come costantemente cercando di leggere dal socket con un po 'relativamente piccolo timeout.
Modifica: Le prese non sono TCP, ma il bluetooth L2CAP
.Soluzione
Un non troppo elegante, ma semplice e soluzione di lavoro: Creare un tubo e lasciare selezionare attesa sia per il tubo o la mia presa. In questo modo posso fermare l'attesa in qualsiasi momento scrivendo qualcosa al tubo.
Altri suggerimenti
Invece di trattare con l'apparecchio da soli filettatura è possibile utilizzare l'interfaccia asincrona di QTcpSocket. Controlla la Fortune client esempio .
È possibile inviare un segnale al terminate()
fessura della vostra QThread. Questo fermerà il tuo thread in base alle politiche di pianificazione del sistema operativo.