Kernelcoder’s Blog.

Bare et annet WordPress.com-nettsted.

Merket med programmering.

Laster inn en webside i en trad.

Du vet det, vi kan ikke lage widgets i en trad, men hovedtrad. Sa hva om vi vil laste inn en side i en trad? Det finnes ulike losninger pa dette problemet. Her er en & # 8230;

WebpageLoader: sidenlasterklassen.

WebpageThread: Siden laster trakklassen.

WebpageViewer: Visningsklassen.

Tegningstekst i Qt.

Nar du vil tegne tekst ved hjelp av QPainter’s drawText-metoden, vil det gjore deg veldig sakte (Qt-eksperter sier at dette skyldes hoy beregning av tegnfigur).

Konstruer et QPainterPath-objekt Legg til teksten ved a ringe addText-metode for QPainterPath tegne tekst ved a bruke QPainter’s drawPath-metoden.

Slik legger du inn linjal / skala type widget i en QAbstractScrollArea type widget?

Vennligst strukturer koden din som folgende & # 8230;

Skriv en klasse arvelig etterkommere klasse av QAbstractScrollArea (Som eksempel QGraphicsView, QMdiArea, QPlainTextEdit, QScrollArea, QTextEdit, QColumnView, QHeaderView, QListView, QTableView, QTreeView etc.) I konstruktoren av klassekallet ditt setViewportMargins og sett margene til venstre / Hoyre / nedre omradets lengde. Lag en QGridLayout og legger til din tilpassede Linjal / Skala i oppsettet. Still inn dette oppsettet og ring inn setLayout.

Nar jeg trengte a lage horisontal / vertikal linjal / skala i en QGraphicsView. Jeg brukte denne teknikken til a gjore det & # 8230;

QDRuler: Herskerklassen.

Qt’s Synkroniserings Primitives.

Nar du ringer las () pa en trad, blokkeres andre anrop for a lase () fra andre trad til traden som eier lasene, lases opp (). Denne metoden blokkerer mate a eie en las pa. Den ikke-blokkerende maten er a ringe tryLock (), som returnerer sant hvis en las eier, falsk pa annen mate. La oss se na hvordan du bruker QMutex-klassen. Vurder folgende kode & # 8230;

Hvis ovennevnte metode blir kalt to ganger suksessivt i en enkelt trad, er verdien av dataene 8.

Hvis den ovennevnte metoden blir kalt samtidig fra to trad, kan folgende hende: & # 8230;

Na, hvis vi bruker en mutex, kan vi lose det som folger & # 8230;

Sa, vi fikk at QMutex-klassen gir tilgangsserialisering mellom trader.

Bruke QWaitCondition med QMutex.

Du vet, det er noen situasjon som oppstar nar en trad ma vente a fortsette for at noen forhold skal motes. Tenk en ventetilstand som det alltid signaliserer at tilstanden er sant til et anrop for a vente () mens det signaliserer at tilstanden er feil. Igjen nar en samtale til wakeOne () eller wakeAll () er laget, signaliserer den at tilstanden er sann. For a angi situasjonen kan vi vurdere et problemomrade, produsent & # 8211; Forbrukerproblem.

Produsenten skriver data til bufferen til den nar slutten av bufferen, hvorpa den starter pa nytt fra begynnelsen, overskriver eksisterende data. Forbrukerens trad leser dataene som den er produsert og skriver den til standardfeil.

Ventevilkar gjor det mulig a ha hoyere grad av samtidighet enn det som er mulig med mutexes alene. Hvis tilgang til bufferen bare var bevoktet av en QMutex, kunne forbruker-traden ikke fa tilgang til bufferen samtidig som produsentens trad. Likevel er det ingen skade i a ha begge tradene som arbeider pa forskjellige deler av bufferen samtidig.

La oss begynne med a gjennomga den sirkul re bufferen og tilhorende synkroniseringsverktoy:

DataSize er mengden data som produsenten vil generere. For a holde eksemplet sa enkelt som mulig, gjor vi det til en konstant. BufferSize er storrelsen pa den sirkul re bufferen. Det er mindre enn DataSize, noe som betyr at produsenten til en viss tid vil na slutten pa bufferen og starte pa nytt fra begynnelsen.

For a synkronisere produsenten og forbrukeren trenger vi to ventetilstander og en mutex. Bufferen er ikke til stede nar produsenten har generert noen data, og forteller forbrukeren at den kan begynne a lese den. BufferenNotFull-tilstanden signaliseres nar forbrukeren har lest noen data, og forteller produsenten at den kan generere mer. NumUsedBytes er antall byte i bufferen som inneholder data.

Sammen venter ventetilstandene, mutexen og NumUsedBytes-telleren at produsenten aldri er mer enn BufferSize bytes foran forbrukeren, og at forbrukeren aldri leser data som forbrukeren ikke har generert enna.

Produsentklasse: La oss se koden for produsentklassen & # 8230;

Produsenten genererer DataSize bytes data. For den skriver en byte til den sirkul re bufferen, ma den forst sjekke om bufferen er full (dvs. numUsedBytes er lik BufferSize). Hvis bufferen er full, venter traden pa bufferNotFull-tilstanden.

Pa slutten, produsentene oker numUsedBytes og signaliserer at tilstanden bufferNotEmpty er sant, siden numUsedBytes er nodvendigvis storre enn 0.

Vi beskytter alle tilgangene til NumUsedBytes-variabelen med en mutex. I tillegg aksepterer QWaitCondition :: wait () -funksjonen en mutex som argument. Denne mutexen er last opp for traden blir satt og last nar traden blir vaken. Videre er overgangen fra last tilstand til ventetilstand atomisk for a forhindre at raseforhold oppstar.

Forbrukerklasse: La & # 8217; s vende seg til forbrukerklassen & # 8230;

Koden er veldig lik produsenten. For vi leser byten, kontrollerer vi om bufferen er tom (numUsedBytes er 0) i stedet for om den er full og vent pa bufferNotEmpty-tilstanden hvis den er tom. Etter at vi har lest byten, senker vi numUsedBytes (i stedet for a oke det), og vi signaliserer bufferNotFull-tilstanden (i stedet for bufferNotEmpty-tilstanden).

Bruke klassene: I hoved () lager vi de to trader og ringer QThread :: wait () for a sikre at begge trader far tid til slutt for vi avslutter:

Sa hva skjer nar vi kjorer programmet? I utgangspunktet er produsentens trad den eneste som kan gjore noe; forbrukeren er blokkert og venter pa at bufferNotEmpty-tilstanden skal signaleres (numUsedBytes er 0). Nar produsenten har satt en byte i bufferen, er numUsedBytes BufferSize & # 8211; 1 og bufferNotEmpty-tilstanden er signalert. Pa det tidspunktet kan to ting skje: Enten forbrukertraden tar over og leser den byte, eller forbrukeren far til a produsere en andre byte.

En semafor er en generalisering av en mutex. Mens en mutex kun kan lases en gang, er det mulig a anskaffe en semafor flere ganger. Semaforer brukes vanligvis til a beskytte et visst antall like ressurser.

Semaforer stotter to grunnleggende operasjoner, erverver () og frigjor ():

anskaffe (n) prover a skaffe n ressurser. Hvis det ikke er mange tilgjengelige ressurser, vil samtalen blokkeres til dette er tilfelle. slipp (n) utgivelser n ressurser.

Lose Produsent-Forbrukerproblem med QSemaphore & # 8230;

Qt Threading System.

Bare arve QThread klasse og overstyr kjore metode. Na mens du ringer startsporet gjennom en forekomst av den arvelige klassen, sa mens din overstyrte lop blir utfort, begynner en annen trad av kontroll med utgangspunktet som lopemetode. Det vil si, kjor metodeutforelse livssyklus (omfang) kjore pa en annen trad.

Hvis du vil kjore en hendelseslokke pa en trad, ring exec-metoden i lopemetoden som folger.

Objektomfanget i gjenget system.

Qt’s forventning er at et objekt som er opprettet i en trad, ogsa slettes fra den traden. Alle objektene pa objektstakken (barn-forelder-treet) av et objekt vil ogsa v re pa den aktuelle traden. Du ma slette alle objekter i en objektbunke pa egen trad (du kan fa en trad som en gjenstand bor etter tradmetode og du kan endre en gjenstands trad med moveToThread-metoden) eller ring deleteLater metode for utsatt sletting fra en annen trad.

Du ma ikke bruke tradobjektet selv som foreldre for objektene som skal opprettes i kjoremetode, fordi tradobjektet selv er opprettet pa en annen trad. Faktisk ma du folge kodingsformatet som du bruker i hovedmetoden (Hovedvinduet er konstruert pa stakken uten at noen forelder og hovedvindu er den overste mesteparten av alle objekter i hovedtraden).

Nar du jobber med samme data fra flere trader, bruker du synkroniseringsteknikker (mutex, semafor etc) for a gi synkronisering mellom trader.

Signaler og spor over tradene.

Qt stotter disse signal-sluttforbindelsestyper:

Auto-tilkobling (standard): Oppforelsen er den samme som direkte tilkobling, hvis sender og mottaker er i samme trad. Oppforselen er den samme som den kjopte tilkoblingen, hvis sender og mottaker er i forskjellige trader. 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 returnerer til hendelseslokken til mottakerens trad. Sporet blir utfort i mottakerens trad. Blokkering i ko-tilkobling: Sporet er pakalt som for den kjopte tilkoblingen, unntatt 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 laget hvis den ikke dupliserer en eksisterende tilkobling. d.v.s. hvis det samme signalet allerede er koblet til samme spor for det samme par objekter, blir forbindelsen ikke laget og forbindelsen () 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 avsender og mottaker bor i forskjellige trader, er usikkert hvis en hendelseslokke kjorer i mottakerens trad, av samme grunn som at en hvilken som helst funksjon pa et objekt som lever i en annen trad, er usikkert.


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