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 usareQMutexLocker
ostd::lock_guard
per gestire i mutex piu' facilmente. dimenticarsi un mutex lockato e' tanto facile quanto dimenticarsi undelete
. Quelle due classi sono l'equivalente distd::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