Semafori e thread
-
Ciao
ho un programma strutturato in questo modo:*MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); qDebug() << "Program started!" QTimer* timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(poll())); //timer->start(1000); timer->start(500); } unsigned char MainWindow::poll() { //------------------------------------------------------------------------------ unsigned char MainWindow::poll() { unsigned short distance; qDebug() << " Polling started"; check_for_interrupt(ADDR, &distance); qDebug() << "valore distanza:" << distance; ui->label->setText("il valore della distanza in mm è: " + QString::number(distance)); } --------------------*
vorrei separare i due processi della visualizzazione e della funzione che ho per controllare gli interrupt.
Mi hanno consigliato di inserire un semaforo e fare multithread.
Esempi e suggerimenti ?
-
@Montanaro Dipende da che tipo di applicazione stai sviluppando, e che cosa si deve fare sugli altri thread... Comunque c'e' il modulo QtConcurrent che puoi sfruttare, oppure gestire le operazioni "a mano" su dei thread separati
-
@guerinoni said in Semafori e thread:
@Montanaro Dipende da che tipo di applicazione stai sviluppando, e che cosa si deve fare sugli altri thread... Comunque c'e' il modulo QtConcurrent che puoi sfruttare, oppure gestire le operazioni "a mano" su dei thread separati
Ti spiego il problema:
la funzione check_for_interrupt usa l'ioctl per leggere l'i2c dal seguente file /dev/usb/MyDevice
uso lo stesso MyDevice per stampare a video (tramite l' ui.label).
Tempo che i due processi entrino in conflitto.Una soluzione che mi è stata suggerita è quella di mettere dei semafori (lock/unlock) per far accedere l'altra funzione alla risorsa solo quando quest'ultima è stata liberata dalla prima.
La classe consigliatami è questa:
https://doc.qt.io/archives/qt-4.8/qmutexlocker.html
Ho dei dubbi che il tutto funzioni ma è una strada che devo provare.Hai idea di come debba fare ?
-
@guerinoni said in Semafori e thread:
@Montanaro Dipende da che tipo di applicazione stai sviluppando, e che cosa si deve fare sugli altri thread... Comunque c'e' il modulo QtConcurrent che puoi sfruttare, oppure gestire le operazioni "a mano" su dei thread separati
all'inizio avevo inserito un QMutex .
mutex.unlock() e mutex.lock()
poi ho visto che bastava mettere le due operazioni su thread separati e funzionava tutto.