C ++

Soittotoiminto C ++ ssa

Soittotoiminto C ++ ssa

Takaisinsoittofunktio on funktio, joka on argumentti, ei parametri, toisessa funktiossa. Toista toimintoa voidaan kutsua pääfunktioksi. Joten kyseessä on kaksi toimintoa: päätoiminto ja itse takaisinsoittotoiminto. Pääfunktion parametriluettelossa takaisinsoittofunktion ilmoitus ilman sen määrittelyä on läsnä, samoin kuin olioilmoitukset ilman määritystä ovat läsnä. Pääfunktio kutsutaan argumenteilla (main ()). Yksi pääfunktiokutsun argumenteista on takaisinkutsufunktion tehokas määrittely. Kohdassa C ++ tämä argumentti viittaa takaisinsoittofunktion määrittelyyn; se ei ole varsinainen määritelmä. Itse takaisinsoittotoimintoa kutsutaan itse asiassa pääfunktion määritelmässä.

Peruspuhelutoiminto C ++: ssa ei takaa asynkronista käyttäytymistä ohjelmassa.  Asynkroninen käyttäytyminen on takaisinkutsutoimintamallin todellinen etu. Asynkronisessa takaisinkutsufunktiokaaviossa päätoiminnon tulos tulisi saada ohjelmalle ennen kuin takaisinsoittotoiminnon tulos saadaan. Tämä on mahdollista tehdä C ++: lla; C ++: lla on kuitenkin kirjasto, jota kutsutaan tulevaisuudeksi, jotta taataan asynkronisen takaisinsoittofunktion toiminta.

Tässä artikkelissa selitetään takaisinsoittotoimintojen perusmenetelmä. Paljon siitä on puhdasta C: tä++. Soiton osalta selitetään myös tulevan kirjaston peruskäyttäytyminen. Perustiedot C ++: sta ja sen osoittimista ovat välttämättömiä tämän artikkelin ymmärtämiseksi.

Artikkelin sisältö

Perussoittotoimintamalli

Soittotoimintamalli tarvitsee pääfunktion ja itse soittotoiminnon. Takaisinkutsutoiminnon ilmoitus on osa pääfunktion parametriluetteloa. Takaisinsoittotoiminnon määritelmä ilmaistaan ​​pääfunktion funktiokutsussa. Takaisintoimintoa kutsutaan itse asiassa pääfunktion määritelmässä. Seuraava ohjelma kuvaa tätä:

#sisältää
käyttämällä nimitilaa vakio;
int pääosastoFn (char ch [], int (* ptr) (int))

int id1 = 1;
int id2 = 2;
int idr = (* ptr) (id2);
cout<<"principal function: "<paluu id1;

int cb (int iden)

cout<<"callback function"<<'\n';
paluu iden;

int main ()

int (* ptr) (int) = &cb;
char cha [] = "ja";
pääFn (cha, cb);
paluu 0;

Tuotos on:

takaisinsoittotoiminto
päätehtävä: 1 ja 2

Päätoiminto on tunnistettu mainosnimelläFF (). Takaisinsoittotoiminto tunnistaa cb (). Takaisinsoittotoiminto on määritelty pääfunktion ulkopuolella, mutta tosiasiallisesti sitä kutsutaan pääfunktion sisällä.

Huomaa takaisinsoittotoiminnon ilmoitus parametrina pääfunktiodeklaration parametriluettelossa. Takaisinsoittotoiminnon ilmoitus on "int (* ptr) (int)". Huomaa takaisinsoittofunktion lauseke, kuten funktiokutsu, pääfunktion määritelmään; mikä tahansa argumentti takaisinsoittofunktion kutsulle välitetään siellä. Tämän funktiokutsun lause on:

int idr = (* ptr) (id2);

Missä id2 on argumentti. ptr on osa parametria, osoitinta, joka linkitetään takaisinsoittofunktion viitteeseen main () -funktiossa.

Huomaa lauseke:

int (* ptr) (int) = &cb;

Main () -funktiossa, joka linkittää takaisinsoittofunktion ilmoituksen (ilman määritelmää) saman takaisinsoittofunktion määritelmän nimeen.

Pääfunktiota kutsutaan main () -funktiossa seuraavasti:

pääFn (cha, cb);

Jossa cha on merkkijono ja cb on soittopyynnön nimi ilman mitään sen argumenttia.

Takaisinsoittotoiminnon synkroninen toiminta

Harkitse seuraavaa ohjelmaa:

#sisältää
käyttämällä nimitilaa vakio;
void basicFn (void (* ptr) ())

cout<<"principal function"<<'\n';
(* ptr) ();

void cb ()

cout<<"callback function"<<'\n';

void fn ()

cout<<"seen"<<'\n';

int main ()

void (* ptr) () = &cb;
pääasiallinenFn (cb);
fn ();
paluu 0;

Tuotos on:

päätehtävä
takaisinsoittotoiminto
nähnyt

Tässä on uusi toiminto. Kaikki uusi toiminto on näyttää "nähty" -lähtö. Main () -funktiossa kutsutaan pääfunktiota ja sitten uutta funktiota fn (). Lähtö osoittaa, että pääfunktion koodi suoritettiin, sitten takaisinsoittotoiminnon koodi ja lopuksi fn () -toiminnon koodi. Tämä on synkronista (yksisäikeistä) käyttäytymistä.

Jos se olisi asynkronista käyttäytymistä, kun kolme koodisegmenttiä kutsutaan järjestyksessä, ensimmäinen koodisegmentti voidaan suorittaa, sen jälkeen kolmannen koodisegmentin suorittaminen, ennen kuin toinen koodisegmentti suoritetaan.

No, funktiota fn () voidaan kutsua pääfunktion määritelmän sisällä pääfunktion () sijasta seuraavasti:

#sisältää
käyttämällä nimitilaa vakio;
void fn ()

cout<<"seen"<<'\n';

void basicFn (void (* ptr) ())

cout<<"principal function"<<'\n';
fn ();
(* ptr) ();

void cb ()

cout<<"callback function"<<'\n';

int main ()

void (* ptr) () = &cb;
pääomaFn (cb);
paluu 0;

Tuotos on:

päätehtävä
nähnyt
takaisinsoittotoiminto

Tämä on asynkronisen käyttäytymisen jäljitelmä. Se ei ole asynkronista käyttäytymistä. Se on edelleen synkronista käyttäytymistä.

Myös pääfunktion koodisegmentin ja takaisinsoittofunktion koodisegmentin suoritusjärjestys voidaan vaihtaa pääfunktion määritelmässä. Seuraava ohjelma kuvaa tätä:

#sisältää
käyttämällä nimitilaa vakio;
 
void basicFn (void (* ptr) ())

(* ptr) ();
cout<<"principal function"<<'\n';

void cb ()

cout<<"callback function"<<'\n';

void fn ()

cout<<"seen"<<'\n';

int main ()

void (* ptr) () = &cb;
pääomaFn (cb);
fn ();
paluu 0;

Tulos on nyt,

takaisinsoittotoiminto
päätehtävä
nähnyt

Tämä on myös asynkronisen käyttäytymisen jäljitelmä. Se ei ole asynkronista käyttäytymistä. Se on edelleen synkronista käyttäytymistä. Todellinen asynkroninen käyttäytyminen voidaan saada, kuten seuraavassa osassa selitetään, tai tulevaisuuden kirjaston kanssa.

Asynkroninen käyttäytyminen ja takaisinsoittotoiminto

Asynkronisen takaisinsoittotoiminnon perusnäytekoodi on:

tyyppi tuotos;
tyyppi cb (tyypin lähtö)

// lausunnot

type basicFn (tyyppi input, type cb (type output))

// lausunnot

Huomaa tulo- ja lähtödatan sijainnit näennäiskoodin eri paikoissa. Takaisinsoittotoiminnon tulo on sen lähtö. Pääfunktion parametrit ovat yleisen koodin syöttöparametri ja takaisinkutsutoiminnon parametri. Tämän mallin avulla kolmas toiminto voidaan suorittaa (kutsua) pää () -funktiossa ennen kuin takaisinsoittotoiminnon lähtö luetaan (edelleen pää- () -toiminnossa). Seuraava koodi kuvaa tätä:

#sisältää
käyttämällä nimitilaa vakio;
char * tuotos;
void cb (char out [])

lähtö = ulos;

void basicFn (char-syöttö [], void (* ptr) (char [50]))

(* ptr) (syöttö);
cout<<"principal function"<<'\n';

void fn ()

cout<<"seen"<<'\n';

int main ()

char input [] = "takaisinsoittotoiminto";
void (* ptr) (char []) = &cb;
basicFn (tulo, cb);
fn ();
cout<paluu 0;

Ohjelman tulos on:

päätehtävä
nähnyt
takaisinsoittotoiminto

Tässä nimenomaisessa koodissa lähtö- ja syöttöpiste sattuu olemaan sama. Pääfunktion () kolmannen toimintakutsun tulos on näytetty ennen soittopyynnön tulosta. Takaisinsoittotoiminto suoritti, viimeisteli ja osoitti tuloksensa (arvon) muuttujalle, lähtö, antaen ohjelman jatkaa ilman häiriöitä. Main () -toiminnossa takaisinsoittotoiminnon lähtöä käytettiin (luettiin ja näytettiin) tarvittaessa, mikä johti asynkroniseen käyttäytymiseen koko järjestelmässä.

Tämä on yksisäikeinen tapa saada takaisinsoittotoiminnon asynkroninen käyttäytyminen puhtaalla C: llä++.

Tulevan kirjaston peruskäyttö

Asynkronisen takaisinkutsutoimintamallin idea on, että pääfunktio palaa ennen soittopyynnön paluuta. Tämä tehtiin epäsuorasti, tehokkaasti yllä olevassa koodissa.

Huomaa yllä olevasta koodista, että takaisinkutsutoiminto vastaanottaa koodin pääsyötön ja tuottaa päälähdön koodille. Tulevaisuuden C ++ -kirjastolla on toiminto nimeltä sync (). Ensimmäinen argumentti tälle toiminnolle on soittopyynnön viite; toinen argumentti on takaisinsoittotoiminnon tulo. Sync () -toiminto palaa odottamatta soittopyynnön suorittamisen päättymistä, mutta antaa soittopyynnön loppuun. Tämä tarjoaa asynkronisen käyttäytymisen. Vaikka soittopyyntötoiminto jatkuu, koska sync () -toiminto on jo palannut, sen alla olevat lauseet jatkavat. Tämä on kuin ihanteellinen asynkroninen käyttäytyminen.

Yllä oleva ohjelma on kirjoitettu alla, ottaen huomioon tulevan kirjaston ja sen synkronointitoiminnon ():

#sisältää
#sisältää
#sisältää
käyttämällä nimitilaa vakio;
tulevaisuudessa tuotos;
merkkijono cb (merkkijono)

paluu nauha;

void basicFn (merkkijono)

lähtö = asynkronointi (cb, tulo);
cout<<"principal function"<<'\n';

void fn ()

cout<<"seen"<<'\n';

int main ()

merkkijono syöttö = merkkijono ("takaisinsoittotoiminto");
basicFn (syöttö);
fn ();
merkkijono ret = lähtö.saada(); // odottaa, että takaisinsoitto palaa tarvittaessa
cout<paluu 0;

Sync () -toiminto tallentaa lopulta takaisinsoittotoiminnon lähdön tulevaan objektiin. Odotettu tulos voidaan saada main () -funktiossa käyttämällä tulevan objektin get () -jäsenfunktiota.

Johtopäätös

Takaisinsoittofunktio on funktio, joka on argumentti, ei parametri, toisessa funktiossa. Soittotoimintamalli tarvitsee pääfunktion ja itse soittotoiminnon. Takaisinkutsutoiminnon ilmoitus on osa pääfunktion parametriluetteloa. Takaisinsoittotoiminnon määritelmä ilmoitetaan pääfunktion funktiokutsussa (main ()). Takaisinsoittotoimintoa kutsutaan itse asiassa pääfunktion määritelmässä.

Soittotoimintamalli ei välttämättä ole asynkroninen. Varmista, että soittopyynnön toimintamalli on asynkroninen, tekemällä koodin pääsyöttö, soittopyynnön toiminto; tee koodin päälähtö, takaisinsoittotoiminnon lähtö; tallenna soittopyynnön tulos muuttujaan tai tietorakenteeseen. Suorita sovelluksen muut lauseet main () -funktiossa, kun olet kutsunut pääfunktion. Kun takaisinsoittotoiminnon lähtö tarvitaan, käytä (lukea ja näyttää) pää- () -toiminnossa sitä silloin tällöin.

Kuinka parantaa FPS ää Linuxissa?
FPS tarkoittaa Kuvaa sekunnissa. FPS: n tehtävänä on mitata kehysnopeus videotoistoissa tai peliesityksissä. Yksinkertaisin sanoin sekunnissa näytettä...
Suosituimmat Oculus App Lab -pelit
Jos olet Oculus-kuulokemikrofonin omistaja, sinun täytyy olla tietoinen sivulatauksesta. Sivulataus on prosessi, jolla ei-kaupallista sisältöä asennet...
Top 10 Games to Play on Ubuntu
Windows platform has been one of the dominating platforms for gaming because of the huge percentage of games that are developing today to natively sup...