Повышение эквивалентности для событий Windows - PullRequest
5 голосов
/ 08 апреля 2011

В Windows C ++ я могу создать дескриптор для события

Дескриптор h = CreateEvent (...)

Затем я могу установить и сбросить это событие

SetEvent (...) и ResetEvent (...)

Наконец, я могу OpenEvents, используя команду OpenEvent (...)

Есть ли положительный импульс для событий?

Ответы [ 4 ]

6 голосов
/ 08 апреля 2011

Я думаю, вам нужно использовать boost::mutex, boost::unique_lock, boost::condition_variable и, возможно, bool для имитации событий.

На самом деле вам может понадобиться что-то вроде WaitForSingleObject, чтобы дождаться события. Может быть так:

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();
                          // }



}
4 голосов
/ 08 апреля 2011

Потоковая библиотека Boost Signals2 может быть вам полезна.Оригинальная библиотека сигналов не была ориентирована на многопотоковое исполнение, но реализовала структуру сигналов / слотов, которая не слишком далеко от идеи событий.Поскольку Signals2 является потокобезопасным, вы должны иметь возможность использовать его для передачи событий между потоками.

0 голосов
/ 08 апреля 2011

То, что вы хотите, это переменная named_condition из библиотеки межпроцессного повышения . Основное отличие от событий Windows заключается в том, что вы должны использовать их вместе с named_mutex .

Обратите внимание, что вы можете использовать эти примитивы boost для одного процесса. Я предполагаю, что они вам нужны, потому что вы используете OpenEvent (что подразумевает совместное использование объекта с использованием имени). Если вы можете избежать использования имени, то вы можете использовать неназванные варианты из библиотеки boost thread .

0 голосов
/ 08 апреля 2011

Повышение lock (мьютекс) сделало бы почти то же самое.Вы можете подождать тех.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...