Trader og QObjects.

Trader og QObjects.

QThread arver QObject. Det avgir signaler for a indikere at traden startet eller avsluttet, og gir ogsa noen fa slots.

Mer interessant er at QObjects kan brukes i flere trader, avgir signaler som pakaller spor i andre trader, og legger hendelser til objekter som «lever» i andre trader. Dette er mulig fordi hver trad har lov til a ha sin egen hendelseslokke.

QObject Reentrancy.

QObject er reentrant. De fleste av sine ikke-GUI-underklasser, som QTimer, QTcpSocket, QUdpSocket, QFtp og QProcess, er ogsa reentrant, noe som gjor det mulig a bruke disse klassene fra flere trader samtidig. Merk at disse klassene er utformet for a bli opprettet og brukt fra en enkelt trad; a skape et objekt i en trad og kalle sine funksjoner fra en annen trad, er ikke garantert a fungere. Det er tre begrensninger a v re klar over:

Barnet til et QObject ma alltid opprettes i traden der foreldrene ble opprettet. Dette inneb rer blant annet at du aldri skal passere QThread-objektet (dette) som forelder for et objekt opprettet i traden (siden selve QThread-objektet ble opprettet i en annen trad). Eventdrevne objekter ma bare brukes i en enkelt trad. Spesielt gjelder dette timermekanismen og nettverksmodulen. For eksempel kan du ikke starte en timer eller koble en kontakt i en trad som ikke er gjenstandens gjenstand. Du ma sorge for at alle objekter som er opprettet i en trad, slettes for du sletter QThread. Dette kan gjores enkelt ved a lage objekter pa stakken i din run () implementering.

Selv om QObject er reentrant, er GUI-klassene, spesielt QWidget og alle dets underklasser, ikke reentrant. De kan bare brukes fra hovedtraden. Som nevnt tidligere, ma QCoreApplication :: exec () ogsa bli kalt fra den traden.

I praksis er det umulig a bruke GUI-klasser i andre trader enn hovedtraden, ved a sette tidkrevende operasjoner i en separat arbeidstrad og vise resultatene pa skjermen i hovedtraden nar arbeidstradens trad er ferdig. Dette er tiln rmingen som brukes for a implementere Mandelbrot og Blocking Fortune Client-eksemplet.

Per-thread Event Loop.

Hver trad kan ha sin egen hendelseslokke. Den innledende traden starter hendelseslokkene med QCoreApplication :: exec (); andre trader kan starte en hendelseslokke med QThread :: exec (). Som QCoreApplication gir QThread en exit (int) -funksjon og en avslutte () –spor.

En hendelseslokke i en trad gjor det mulig for traden a bruke visse ikke-GUI Qt-klasser som krever tilstedev relse av en hendelseslokke (som QTimer, QTcpSocket og QProcess). Det gjor det ogsa mulig a koble signaler fra alle trader til spor av en bestemt trad. Dette forklares mer detaljert i avsnittet Signaler og spor over tradene nedenfor.

En QObject-forekomst sies a leve i traden der den er opprettet. Hendelser til den gjenstanden sendes ut av den tradens hendelseslokke. Traden der et QObject-liv er tilgjengelig, bruker QObject :: thread ().

Merk at for QObjects som er opprettet for QApplication, returnerer QObject :: thread () null. Dette betyr at hovedtraden kun handterer utsendte hendelser for disse objektene; Andre hendelsesbehandlinger er ikke ferdig for objekter uten trader. Bruk QObject :: moveToThread () -funksjonen til a endre tradaffiniteten for en gjenstand og dens barn (objektet kan ikke flyttes hvis det har en forelder).

Kaller slette pa et QObject fra en annen trad enn den som eier objektet (eller tilgang til objektet pa andre mater) er usikkert, med mindre du garanterer at objektet ikke behandler hendelser i oyeblikket. Bruk QObject :: deleteLater () i stedet, og en Event Utfordring vil bli lagt ut, som hendelseslokken til objektets trad vil etter hvert hente. Som standard er traden som eier et QObject, traden som lager QObject, men ikke etter QObject :: moveToThread () er blitt kalt.

Hvis ingen hendelseslokke kjorer, vil hendelser ikke bli levert til objektet. Hvis du for eksempel lager et QTimer-objekt i en trad, men aldri ringer exec (), vil QTimer aldri sende ut timeout-signalet (). Ringe deleteLater () vil heller ikke fungere. (Disse restriksjonene gjelder ogsa for hovedtraden.)

Du kan manuelt legge inn hendelser til et hvilket som helst objekt i en hvilken som helst trad ved a bruke tradsikker funksjon QCoreApplication :: postEvent (). Hendelsene sendes automatisk av hendelseslokken til traden der objektet ble opprettet.

Hendelsesfiltre stottes i alle trader, med begrensningen at overvakingsobjektet ma leve i samme trad som det overvakede objektet. Pa samme mate kan QCoreApplication :: sendEvent () (i motsetning til postEvent ()) bare brukes til a sende hendelser til objekter som lever i traden som funksjonen kalles fra.

Fa tilgang til QObject-underklasser fra andre trader.

QObject og alle dets underklasser er ikke tradssikre. Dette inkluderer hele arrangementet for levering av hendelser. Det er viktig a huske pa at hendelseslokken kan levere hendelser til QObject-underklassen mens du far tilgang til objektet fra en annen trad.

Hvis du ringer en funksjon pa en QObject-underklasse som ikke lever i gjeldende trad, og objektet kan motta hendelser, ma du beskytte all tilgang til QObject-underklasseets interne data med en mutex; Ellers kan du oppleve krasjer eller annen uonsket oppforsel.

Som andre objekter lever QThread-objekter i traden der objektet ble opprettet – ikke i traden som opprettes nar QThread :: run () kalles. Det er generelt usikkert a gi spor i QThread-underklassen din, med mindre du beskytter medlemsvariablene med en mutex.

Pa den annen side kan du trygt sende ut signaler fra QThread :: run () implementeringen, fordi signalutslipp er tradsikker.

Signaler og spor over tradene.

Qt stotter disse signal-sluttforbindelsestyper:

Auto-tilkobling (standard) Hvis signalet sendes ut i traden som mottaksobjektet har tilknytning til, er oppforselen den samme som direkte tilkobling. Ellers er oppforselen den samme som den kjopte tilkoblingen. » Direkte tilkobling Sporet er pakalt umiddelbart nar signalet sendes ut. Sporet blir utfort i emitterens trad, som ikke nodvendigvis er mottakers trad. Koble tilkobling Sporet er pakalt nar kontrollen gar tilbake til hendelseslokken pa mottakerens trad. Sporet blir utfort i mottakerens trad. Blokkering i ko-tilkobling Sporet er pakalt som for den koble tilkoblingen, bortsett fra de gjeldende tradblokkene til sporet returnerer. Merk: Ved a bruke denne typen for a koble til objekter i samme trad, vil det fore til dodlas. Unik tilkobling Oppforselen er den samme som den automatiske tilkoblingen, men forbindelsen er bare gjort hvis den ikke dupliserer en eksisterende tilkobling. ie.e # x2e;, hvis det samme signalet allerede er koblet til samme spor for samme par objekter, blir forbindelsen ikke gjort og tilkobling () returnerer false.

Tilkoblingstypen kan spesifiseres ved a sende et ekstra argument til a koble til (). V r oppmerksom pa at bruk av direkte tilkoblinger nar avsenderen og mottakeren lever i forskjellige trader, er usikker hvis en hendelseslokke kjorer i mottakerens trad, av samme grunn som at en hvilken som helst funksjon pa en gjenstand som lever i en annen trad, er usikker.

Mandelbrot-eksemplet bruker en koforbindelse for a kommunisere mellom en arbeidstrad og hovedtraden. For a unnga frysing av hovedtradens hendelseslokke (og som folge av programmets brukergrensesnitt), blir hele Mandelbrot fraktal beregning gjort i en separat arbeidstrad. Graet sender et signal nar det er gjort som gir fraktalen.

Pa samme mate bruker Blocking Fortune Client-eksemplet en separat trad for a kommunisere med en TCP-server asynkront.

&kopiere; 2008-2011 Nokia Corporation og / eller dets datterselskaper. Nokia, Qt og deres respektive logoer er varemerker for Nokia Corporation i Finland og / eller andre land over hele verden.

Alle andre varemerker tilhorer deres respektive eiere. Personvernregler.

Lisensinnehavere med gyldige Qt Commercial lisenser kan bruke dette dokumentet i henhold til Qt Commercial License Agreement som folger med Programvaren eller, alternativt, i samsvar med vilkarene i en skriftlig avtale mellom deg og Nokia.

Alternativt kan dette dokumentet brukes under vilkarene i GNU Free Documentation License versjon 1.3 som publisert av Free Software Foundation.