Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Italian
  4. Eccezioni Qlist sotto Windows CE

Eccezioni Qlist sotto Windows CE

Scheduled Pinned Locked Moved Solved Italian
7 Posts 2 Posters 2.5k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • T Offline
    T Offline
    tonypello
    wrote on last edited by
    #1

    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.

    1 Reply Last reply
    0
    • VRoninV Offline
      VRoninV Offline
      VRonin
      wrote on last edited by VRonin
      #2

      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

      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
      ~Napoleon Bonaparte

      On a crusade to banish setIndexWidget() from the holy land of Qt

      1 Reply Last reply
      0
      • T Offline
        T Offline
        tonypello
        wrote on last edited by
        #3

        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?

        1 Reply Last reply
        0
        • VRoninV Offline
          VRoninV Offline
          VRonin
          wrote on last edited by VRonin
          #4

          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

          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
          ~Napoleon Bonaparte

          On a crusade to banish setIndexWidget() from the holy land of Qt

          T 1 Reply Last reply
          0
          • VRoninV VRonin

            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

            T Offline
            T Offline
            tonypello
            wrote on last edited by
            #5

            @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?

            VRoninV 1 Reply Last reply
            0
            • T tonypello

              @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?

              VRoninV Offline
              VRoninV Offline
              VRonin
              wrote on last edited by
              #6

              @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

              "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
              ~Napoleon Bonaparte

              On a crusade to banish setIndexWidget() from the holy land of Qt

              T 1 Reply Last reply
              0
              • VRoninV VRonin

                @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

                T Offline
                T Offline
                tonypello
                wrote on last edited by
                #7

                @VRonin

                Grazie mille sei stato gentilissimo
                Alla prossima

                1 Reply Last reply
                0

                • Login

                • Login or register to search.
                • First post
                  Last post
                0
                • Categories
                • Recent
                • Tags
                • Popular
                • Users
                • Groups
                • Search
                • Get Qt Extensions
                • Unsolved