QThread: Du gjorde ikke sa galt.

QThread: Du gjorde ikke sa galt.

Dette innlegget handler om bruk av QThread. Det er et svar pa et tre ar gammelt blogginnlegg av Brad, min kollega pa den tiden:

I hans blogginnlegg forklarer Brad at han sa mange brukere misbruk QThread ved a underklassere den, legge til noen spor i den underklassen og gjore noe slikt i konstruktoren:

De flytter en trad til seg selv. Som Brad nevner, er det feil: QThread skal v re grensesnittet for a administrere traden. Sa det skal brukes fra den opprettede traden.

Spor i QThread-objektet kjores da ikke i den traden og a ha spor i en underklasse av QThread er en darlig praksis.

Men sa fortsetter Brad og frarader noen underklassering av QThread i det hele tatt. Han hevder at det er mot riktig objektorientert design. Det er her jeg er uenig. Putting code in run () er en gyldig objektorientert mate a utvide QThread: En QThread representerer en trad som bare starter en hendelseslokke, en underklasse representerer en trad som er utvidet til a gjore det som er i run ().

Etter Brads innlegg gikk noen medlemmer av samfunnet pa en korstog mot underklassifisering QThread. Problemet er at det er mange helt gyldige grunner til underklasse QThread.

Med Qt 5.0 og Qt 4.8.4 ble dokumentasjonen av QThread endret, slik at provekoden ikke inneb rer underklassering. Se pa den forste kodesammenstillingen av Qt 4.8 QThread-dokumentasjonen (Oppdater: lenke til archive.org siden nyere dokumentasjon er lost). Det har mange linjer med kjeleplate bare for a kjore noen kode i en trad. Og det er enda en lekkasje: QThread kommer aldri til a slutte og bli odelagt.

Jeg ble spurt pa IRC et sporsmal fra en bruker som fulgte dette eksempelet for a kjore noen enkel kode i en trad. Han hadde det vanskelig a finne ut hvordan man kunne odelegge traden. Det er det som motiverte meg til a skrive denne blogginnlegget.

Hvis du tillater underklasse QThread, er dette det du fikk:

Denne koden lekker ikke lenger og er mye enklere og har mindre overhead da det ikke skaper ubrukelig gjenstand.

Qt-tradereksemplet threadedfortuneserver er et eksempel som bruker dette monsteret til a kjore blokkeringsoperasjoner og er mye enklere enn det tilsvarende ved hjelp av et arbeiderobjekt.

Jeg har sendt inn en oppdatering til dokumentasjonen for ikke a frata underklassifisering QThread lenger.

Tommelfingerregel.

Nar til underklasse og nar ikke?

Hvis du ikke virkelig trenger en hendelse sloyfe i traden, bor du underklasse. Hvis du trenger en hendelseslokke og handterer signaler og spor i traden, trenger du kanskje ikke a v re underklasse.

Hva med a bruke QtConcurrent i stedet?

QThread er et ganske lavt niva, og du bor bedre bruke en hoyere niva API som QtConcurrent.

Na har QtConcurrent sitt eget sett med problemer: Det er knyttet til et enkelt tradbasseng, sa det er ikke en god losning hvis du vil kjore blokkeringsoperasjoner. Det har ogsa noen problemer i implementeringen som gir litt ytelse overhead. Alt dette kan loses. Kanskje til og med Qt 5.1 vil se noen forbedringer.

Et godt alternativ er ogsa C ++ 11 standardbiblioteket med std :: thread og std :: async som na er standard mate a kjore kode pa i en trad. Og den gode nyheten er at det fortsatt fungerer fint med Qt: Alle andre Qt-trekksprotiver kan brukes med innfodte trader. (Qt vil opprette automatisk opprette QThread hvis nodvendig).

Woboq er et programvare selskap som spesialiserer seg pa utvikling og radgivning rundt Qt og C ++. Lei oss!

Hvis du liker denne bloggen og vil lese lignende artikler, bor du vurdere a abonnere via var RSS-feed, via e-post eller folge oss pa twitter eller legg til oss pa G +.


Hi! Want to play in the most lucky casino? We found it for you. Play here now!