| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > MessageBox, и возвратный интерфейс для нотификации |
| Автор: neosapient 31.1.2008, 17:13 | ||||
| Ситуация - есть API, которое рабоает ассинхронно, то есть я делаю запрос в одном потоке, а меня дергают за плече и говорят - ваш запрос готов, и передают результат в мою функцию обратного вызова. Всё вроде понятно, вот только есть проблема - как дождаться чтоб меня дергали за плечо. Итак, описываю класс объекта MyClass. Для него указываю функции обратного вызова (по адресам)
Далее собственно исполнемый код.
Когда создается объект MyClass handler, в конструкторе вызывается метод Starting() Затем моя программа повисает в ожиданиии нажатия клавиши MessageBox`а А в это время я жду, что с той стороны должна быть вызвана моя функция OnStarted(). Когда она вызвана я уведомляю себя, что интерфейс подгрузился, ура, и что можно закрыть MessageBox. Затем отсылаются другие запросы, он это к посту не отноститься. Так вот, логчным мне показалось, что не стоит у пользователя выробатывать рефлекс павлава по закрытию MessageBox`а. Нужна синхронизация ) Пробовал критические секции и мьютексы. Вставилял их - залокировался сразу после выполнения метода Starting() А разлокировать должен был вызове OnStarted(). При этом в остновном потоке ждал освобождения критической секции или мьютекса. Даже пробовал обычный флаг с конструкцией while(handler.fStart==0)Sleep(1); НО в этих трех варианах - обратного вызова через OnStarted() не последовало ( Вернул MessageBox, чтоб убидиться что я не дурак. С ним всё заработало?!. Ни чего не понимаю - как так происходит вся синхронизация в COM, что лишь MessageBox позволяет получать уведомление в обратную сторону (ко мне в прогу) через зарегистрирований мной OnStarted()??? (может кто сталкивался) |