C + + GUI programmering med Qt4: Multithreading.

Dette kapitlet er fra boken.

Dette kapitlet er fra boken.

Dette kapitlet er fra boken & # xF501;

14. Multithreading.

Opprette trader som synkroniserer trader Kommuniserer med hovedgruppen ved hjelp av Qt-klasser i sekund re trader.

Konvensjonelle GUI-applikasjoner har en trad med utforelse og utforer en operasjon av gangen. Hvis brukeren paberoper seg en tidkrevende operasjon fra brukergrensesnittet, fryser grensesnittet vanligvis mens operasjonen pagar. Kapittel 7 presenterer noen losninger pa dette problemet. Multithreading er en annen losning.

I en multithreaded applikasjon kjorer GUI i sin egen trad, og ytterligere behandling finner sted i en eller flere andre trader. Dette resulterer i applikasjoner som har responsive GUIer selv under intensiv behandling. Nar du loper pa en enkelt prosessor, kan multithreaded applikasjoner kjore langsommere enn en enkelt-gjenget ekvivalent pa grunn av overhead for a ha flere trader. Men pa multiprosessorsystemer, som blir stadig mer vanlige, kan multithreaded applikasjoner utfore flere trader samtidig pa forskjellige prosessorer, noe som resulterer i bedre ytelse.

I dette kapittelet vil vi begynne med a vise hvordan underklasse QThread og hvordan du bruker QMutex, QSemaphore og QWaitCondition for a synkronisere trader. [*] Da ser vi hvordan vi kommuniserer med hovedtraden fra sekund re trader mens hendelseslokken kjorer. Til slutt avslutter vi med en gjennomgang av hvilke Qt-klasser som kan brukes i sekund re trader, og som ikke kan.

Multithreading er et stort emne med mange boker som er viet til temaet, for eksempel, Threads Primer: En Guide til Multithreaded Programming av Bil Lewis og Daniel J. Berg (Prentice Hall, 1995) og Multithreaded, Parallel og Distributed Programming by Gregory Andrews (Addison-Wesley, 2000). Her antas det at du allerede forstar grunnleggende for multithreaded programmering, sa fokus er pa a forklare hvordan man utvikler multithreaded Qt-applikasjoner, snarere enn pa temaet for traden selv.

Opprette trader.

A levere flere trader i en Qt-applikasjon er rett: Vi bare underklasse QThread og reimplement run () -funksjonen. For a vise hvordan dette virker, starter vi ved a se gjennom koden for en veldig enkel QThread-underklasse som gjentatte ganger skriver ut en bestemt streng pa en konsoll. Programmets brukergrensesnitt er vist i Figur 14.1.

Figur 14.1 Traden applikasjonen.

Trad-klassen er avledet fra QThread og reimplements run () -funksjonen. Den gir to tilleggsfunksjoner: setMessage () og stopp ().

Den stoppede variabelen er erkl rt flyktig fordi den er tilgjengelig fra forskjellige trader, og vi vil v re sikre pa at den leses hver gang den trengs. Hvis vi utelatt det flyktige sokeordet, kan kompilatoren optimalisere tilgangen til variabelen, muligens fore til feilresultater.

Vi satt stoppet til falsk i konstruktoren.

Run () -funksjonen kalles for a begynne a utfore traden. Sa lenge den stoppede variabelen er feil, fortsetter funksjonen a skrive ut den oppgitte meldingen til konsollen. Traden slutter nar kontrollen forlater kjoringen () -funksjonen.

Stopp () -funksjonen setter den stoppede variabelen til ekte, og forteller dermed lop () for a slutte a skrive ut tekst til konsollen. Denne funksjonen kan nar som helst ringes fra en hvilken som helst trad. I dette eksemplet antar vi at tildeling til en bool er en atomoperasjon. Dette er en rimelig antagelse, med tanke pa at en bool kun har to stater. Vi vil se senere i denne delen hvordan du bruker QMutex for a garantere at tildeling til en variabel er en atomoperasjon.

QThread gir en terminate () -funksjon som avslutter gjennomforingen av en trad mens den fortsatt kjorer. Bruk av terminate () anbefales ikke, siden det kan stoppe traden nar som helst og gir ikke traden noen sjanse til a rydde opp etter seg selv. Det er alltid tryggere a bruke en stoppet variabel og en stopp () -funksjon som vi gjorde her.

Vi vil na se hvordan du bruker trakklassen i et lite Qt-program som bruker to trader, A og B, i tillegg til hovedtraden.

ThreadDialog-klassen erkl rer to variabler av typen Trad og noen knapper for a gi et grunnleggende brukergrensesnitt.

I konstruktoren kaller vi setMessage () for a gjore den forste traden gjentatte ganger skrevet ut ‘A’ og den andre traden ‘B’.

Nar brukeren klikker pa knappen for trad A, stopper startOrStopThreadA () stoppen hvis den kjorer og starter den pa annen mate. Det oppdaterer ogsa knappens tekst.

Koden for startOrStopThreadB () er strukturelt identisk.

Hvis brukeren klikker Avslutt eller lukker vinduet, stopper vi eventuelle lopende trader og venter pa at de skal fullfores (ved hjelp av QThread :: wait ()) for vi kaller QCloseEvent :: accept (). Dette sikrer at applikasjonen gar ut i en ren tilstand, selv om det ikke virkelig betyr noe i dette eksemplet.

Hvis du kjorer programmet og klikker pa Start A, blir konsollen fylt med ‘A’. Hvis du klikker pa Start B, vil den na fylle med alternerende sekvenser av ‘A’ og ‘B’. Klikk Stopp A, og na vil det bare skrive ut ‘B’.


Hilsen! Vil du spille i det beste kasinoet? Vi forbereder det for deg. Spill her nå!