#c #winapi #stdthread
#c #winapi #stdthread
Вопрос:
У меня есть рабочий фрагмент кода для функции main в Windows с C , например:
some_handle = dll_generate_handle;
while(true) {
if(WaitForSingleObject(some_handle,100)){
//CODE I AM INTERESTED ABOUT
}
}
Сигнал поступает из функции dll.
Я пытаюсь перенести этот принцип в фреймворк следующим образом:
-
У меня снова есть main, но этот main получает статический экземпляр класса i1. У этого класса есть функция-член «event_checking», выполняющая тот же фрагмент кода, что и выше.
-
Я могу получить доступ к этой функции event_checking через экземпляр i2 промежуточного класса, поэтому я решил обернуть i1.event_checking с
void eventCheckingWrapper(){ i1.event_checking(); }
-
Все еще в main я создаю поток в eventCheckingWrapper. Поэтому я не заинтересован в том, чтобы поток возвращался до тех пор, пока поступают сигналы.
Примером этого принципа может быть:std::thread t(amp;ClassName::eventCheckingWrapper, amp;i2);
Поток работает нормально, но никаких сигналов не поступает, так что время ожидания всегда истекает, и поток запускается снова в цикле while.
Как я могу правильно заставить это работать?
Комментарии:
1. Потоку нужен дескриптор из библиотеки DLL, затем он может дождаться дескриптора и вызвать вашу оболочку события при подаче сигнала
2. В обоих случаях я получаю дескриптор из библиотеки dll. Только в одном случае я получаю его в main, а в другом — внутри функции event_checking непосредственно перед бесконечным временем ожидания , в котором дескриптор ожидает много раз.
3. Если DLL не поддерживает поток (маловероятно), не должно иметь значения, какой поток получает дескриптор. Но вы всегда можете заставить
main
сначала получить дескриптор, а затем передать его потоку, если это необходимо. Ожидание дескриптора сWaitForSingleObject()
может быть выполнено в любом потоке, независимо от того, какой поток получает дескриптор. Если ваш поток не обнаруживает сигнал, то либо дескриптор вообще не сигнализируется, либо состояние дескриптора сбрасывается в безсигнальное, прежде чем поток ожидает его.
Ответ №1:
Я решил проблему. Итак, все, что сказал Реми Лебо, было правдой. В конце концов, в dll была функция для активации приема сигналов через дескриптор события, которую мне приходилось вызывать раньше. Итак, на самом деле никаких сигналов не поступало, но просто для информации то, что я смог подтвердить после этого опыта отладки, заключалось в основном в том, что «родительские» потоки необходимо поддерживать в Windows, winapi WaitForSingleObject() сохраняет состояние события, о котором сообщается, если оно не было ожидаемо, и новая повторная настройка события не изменяет его состояние (остается сигнализированным) до тех пор, пока ни один поток не дождался его (после чего оно меняется на безсигнализированное режим), так что проблем со временем не возникает. На самом деле, следует проверить, относятся ли события, предоставляемые сторонним программным обеспечением 3d, к потоку, в котором он был создан, и, следовательно, нет ли проблем с извлечением дескриптора. Спасибо!