![]() |
|
|
![]()
|
|
| neosapient |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: нет Всего: 4 |
Ситуация - есть API, которое рабоает ассинхронно, то есть я делаю запрос в одном потоке, а меня дергают за плече и говорят - ваш запрос готов, и передают результат в мою функцию обратного вызова. Всё вроде понятно, вот только есть проблема - как дождаться чтоб меня дергали за плечо.
Итак, описываю класс объекта MyClass. Для него указываю функции обратного вызова (по адресам)
Далее собственно исполнемый код.
Когда создается объект MyClass handler, в конструкторе вызывается метод Starting() Затем моя программа повисает в ожиданиии нажатия клавиши MessageBox`а А в это время я жду, что с той стороны должна быть вызвана моя функция OnStarted(). Когда она вызвана я уведомляю себя, что интерфейс подгрузился, ура, и что можно закрыть MessageBox. Затем отсылаются другие запросы, он это к посту не отноститься. Так вот, логчным мне показалось, что не стоит у пользователя выробатывать рефлекс павлава по закрытию MessageBox`а. Нужна синхронизация ) Пробовал критические секции и мьютексы. Вставилял их - залокировался сразу после выполнения метода Starting() А разлокировать должен был вызове OnStarted(). При этом в остновном потоке ждал освобождения критической секции или мьютекса. Даже пробовал обычный флаг с конструкцией while(handler.fStart==0)Sleep(1); НО в этих трех варианах - обратного вызова через OnStarted() не последовало ( Вернул MessageBox, чтоб убидиться что я не дурак. С ним всё заработало?!. Ни чего не понимаю - как так происходит вся синхронизация в COM, что лишь MessageBox позволяет получать уведомление в обратную сторону (ко мне в прогу) через зарегистрирований мной OnStarted()??? (может кто сталкивался) Это сообщение отредактировал(а) neosapient - 31.1.2008, 17:14 |
||||
|
|||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |