Как заставить WaitForSingleObject получить сигнал внутри потока, вызываемого из main как функция-член класса? - PullRequest
0 голосов
/ 27 марта 2019

У меня есть рабочий кусок кода для основной функции в Windows с C ++, например:

some_handle = dll_generate_handle;
while(true) {
    if(WaitForSingleObject(some_handle,100)){
          //CODE I AM INTERESTED ABOUT
    }
}

Сигнал поступает из функции DLL. Я пытаюсь перенести этот принцип в структуру следующим образом:

  1. У меня снова есть main, но эта main получает статический экземпляр класса i1. Этот класс имеет функцию-член "event_checking", выполняющую тот же фрагмент кода, что и выше.

  2. Я могу получить доступ к этой функции event_checking через экземпляр i2 промежуточного класса, поэтому я решил обернуть i1.event_checking с помощью

    void eventCheckingWrapper(){
        i1.event_checking();
    }
    
  3. Все еще в основном я создаю поток на eventCheckingWrapper. Поэтому я не заинтересован в том, чтобы поток возвращался, пока поступают сигналы. Примером этого принципа может быть:

    std::thread t(&ClassName::eventCheckingWrapper, &i2);
    

Поток работает нормально, но сигналы не поступают, так что время ожидания всегда достигается, и поток запускается в цикле while.

Как мне правильно заставить это работать?

1 Ответ

0 голосов
/ 28 марта 2019

Я решил проблему. Так что все, что сказал Реми Лебо, было правдой. В конце концов у dll была функция активировать прием сигналов через дескриптор события, который мне приходилось вызывать раньше. Таким образом, на самом деле никаких сигналов не поступало, но просто для информации, что я мог подтвердить после того, как после этого процесса отладки было в основном то, что «родительские» потоки должны поддерживаться в Windows, winapi WaitForSingleObject () сохраняет состояние события, сигнализируемое, если оно не имеет ожидание, и новая переустановка события не изменяет его состояние (остается сигнальным), пока ни один поток не ожидал его (после чего он переходит в режим без сигнала), поэтому проблемы со временем не возникают. На самом деле, следует проверить, относятся ли события, предоставляемые сторонним программным обеспечением, к потоку, в котором оно было создано, и, следовательно, нет ли проблем с получением дескриптора. Спасибо!

...