c ++ - Boost Equivalent for Windows Events

Indlæg af Hanne Mølgaard Plasc

Problem



I vinduer c + + kan jeg oprette et håndtag til begivenhed


Håndter h=CreateEvent (...)


Jeg kan derefter indstille og nulstille den begivenhed


SetEvent (...) og ResetEvent (...)


Endelig kan jeg OpenEvents bruge kommandoen OpenEvent (...)


Er der et boost i forhold til begivenheder?

Bedste reference


Jeg tror, ​​du skal bruge boost::mutex, boost::unique\_lock, boost::condition\_variable og muligvis bool for at efterligne Events.


Du kan faktisk have brug for en slags WaitForSingleObject for at vente på en begivenhed. Måske være sådan:


void wait\_for\_user\_input()
{
    boost::unique\_lock<boost::mutex> lock(mut);
    while(!data\_ready)
    {
        cond.wait(lock);
    }
    process\_user\_input(); // it might be not necessary to hold mutex locked here!!!
                          // if so just add curly braces like this:
                          // void wait\_for\_user\_input()
                          // {
                          //    { 
                          //      boost::unique\_lock<boost::mutex> lock(mut);
                          //      while(!data\_ready) { cond.wait(lock); }
                          //    }
                          //    process\_user\_input();
                          // }



}

Andre referencer 1


Biblioteket Threadsafe Boost Signals2 kan være til nytte for dig. Det originale Signals bibliotek var ikke trådsikker, men implementerede en signaler/slots ramme, som ikke er for mange miles væk fra ideerne om begivenheder. Da Signals2 er trådbeskyttet, skal du kunne bruge det til at overføre begivenheder mellem tråde. [7]

Andre referencer 2


En boost lås (mutex) ville gøre stort set det samme. Du kan vente på dem. [8]

Andre referencer 3


Hvad du vil have, er named\_condition variabel fra boost interprocess biblioteket. Hovedforskellen fra Windows-begivenheder er, at du skal bruge dem sammen med en navngivet\_mutex. [9] [10] [11]


Bemærk, du kan bruge disse boost interprocess primitives inden for en enkelt proces. Jeg går ud fra, at du har brug for disse, fordi du bruger OpenEvent (hvilket indebærer deling af objektet ved brug af et navn). Hvis du kan undgå at bruge et navn, kan du bruge de ikke-navngivne varianter fra boost-trådbiblioteket. [12]