Eccezioni Qlist sotto Windows CE



  • Buongiorno,
    Utilizzo Qt 4.6 sotto WindowsCE, il software che sviluppo è formato da molti thread che girano più o meno sincroni con le varie priorità gestite da WindowsCE.
    Nel codice utilizzo delle liste Qlist che possono essere modificate dai thread aggiungendo o rimuovendo elementi da essi.
    Ogni thread è gestito con una run infinita e un blocco __try ed __except in questo modo:

    __try
     {
    
            for (;;)
     	{
                // azioni relative al thread
               // azioni su liste Qlist
            }
    
    }
    
    __except(//)
     { 
    
     }
    
    

    Il problema principale è che quando un thread agisce su una Qlist per esempio rimuovendo degli elementi all'interno di un ciclo for, WinCE potrebbe schedulare l'esecuzione di un altro thread che accendendo a posizioni non valide della Qlist fa andare in crash tutto. La mia domanda è: come posso risolvere questo comportamento? Anche perché le eccezioni non sono gestite da Qt...
    Spero di essermi spiegato,
    Grazie.



  • Questo non e' un problema di Qt ma il piu' basilare problema della programmazione in piu' thread, ossia condividere le risorse.

    La soluzione e' usare un mutex (std::mutex, QMutex, QReadWriteLock sono tutte opzioni valide) per assicurarsi che solo un thread agisca sullo stesso oggetto allo stesso momento



  • Grazie per la pronta risposta, se avessi un caso per esempio cosi:

    Thread1

    //MUTEX START
    for (int index = 0; index < myList.size(); index++)
     {
     	if (myList.at(index)==Name1)
     	{
                 // Fai qualcosa
     	}
     }
    
    //MUTEX STOP
    

    Thread 2

    myList.removeLast()
    
    

    Se per esempio WinCe bloccasse l'esecuzione del primo thread dopo aver fatto la size (nel for) dando la priorità al secondo thread (che rimuove l'ultimo elemento) avrei un eccezione, quindi dovrei proteggere col mutex da mutex start a mutex stop giusto?



  • si, ovviamente il mutex va bloccato anche prima di myList.removeLast()

    P.S.
    puoi usare QMutexLockero std::lock_guard per gestire i mutex piu' facilmente. dimenticarsi un mutex lockato e' tanto facile quanto dimenticarsi un delete. Quelle due classi sono l'equivalente di std::unique_ptr per i mutex



  • @VRonin said in Eccezioni Qlist sotto Windows CE:

    QMutexLocker

    Grazie per la dritta, quindi con QMutexLocker blocco all'inizio di una funzione e quando la funzione termina viene automaticamente distrutto giusto? Mentre se volessi sbloccarlo magari prima devo sempre intervenire con un mutex.unlock?



  • @tonypello said in Eccezioni Qlist sotto Windows CE:

    Grazie per la dritta, quindi con QMutexLocker blocco all'inizio di una funzione e quando la funzione termina viene automaticamente distrutto giusto?

    giusto

    Mentre se volessi sbloccarlo magari prima devo sempre intervenire con un mutex.unlock?

    Puoi sempre usare QMutexLocker::unlock/QMutexLocker::relock. QMutexLocker, ti garantisce che quando il suo distruttore e' chiamato il mutex e' sbloccato ma metre QMutexLocker e' vivo puoi bloccarlo e sbloccarlo quante volte vuoi



  • @VRonin

    Grazie mille sei stato gentilissimo
    Alla prossima


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.