Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

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.


Log in to reply