Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MessageBox, и возвратный интерфейс для нотификации, что волшебное проделывает MessageBox 
:(
    Опции темы
neosapient
Дата 31.1.2008, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: нет
Всего: 4



Ситуация - есть API, которое рабоает ассинхронно, то есть я делаю запрос в одном потоке, а меня дергают за плече и говорят - ваш запрос готов, и передают результат в мою функцию обратного вызова. Всё вроде понятно, вот только есть проблема - как дождаться чтоб меня дергали за плечо.



Итак, описываю класс объекта MyClass. 
Для него указываю функции обратного вызова (по адресам)

Код

   BEGIN_SINK_MAP(MyClass)
      SINK_ENTRY_EX(1, __uuidof(_IEvents), 0x00000001, OnError)
      SINK_ENTRY_EX(1, __uuidof(_IEvents), 0x00000002, OnStarted)
      SINK_ENTRY_EX(1, __uuidof(_IEvents), 0x00000003, OnChanged)
    END_SINK_MAP()


Далее собственно исполнемый код.

Код

int main(void)
{

   try
   {
    MyClass handler;
                ::MessageBox(0, "Click OK to finish the test", "title", MB_OK);

    // отсылаю другие запросы
   }
   catch (std::exception& e)
   {
      std::cerr << "Exception: " << e.what() << '\n';
      return FALSE;
   }
   catch (...)
   {
      std::cerr << "Unknown exception occurred\n";
      return FALSE;
   }
   return TRUE;
}


Когда создается объект MyClass handler, в конструкторе вызывается метод Starting()

Затем моя программа повисает в ожиданиии нажатия клавиши MessageBox`а

А в это время я жду, что с той стороны должна быть вызвана моя функция OnStarted().
Когда она вызвана я уведомляю себя, что интерфейс подгрузился, ура, и что можно закрыть MessageBox.

Затем отсылаются другие запросы, он это к посту не отноститься.

Так вот, логчным мне показалось, что не стоит у пользователя выробатывать рефлекс павлава по закрытию MessageBox`а. Нужна синхронизация )

Пробовал критические секции и мьютексы.
Вставилял их - залокировался сразу после выполнения  метода Starting()
А разлокировать должен был вызове OnStarted().

При этом в остновном потоке ждал освобождения критической секции или мьютекса.


Даже пробовал обычный флаг с конструкцией
while(handler.fStart==0)Sleep(1);

НО в этих трех варианах - обратного вызова через OnStarted() не последовало (

Вернул MessageBox, чтоб убидиться что я не дурак. С ним всё заработало?!.  smile 

Ни чего не понимаю - как так происходит вся синхронизация в COM, что лишь MessageBox позволяет получать уведомление в обратную сторону (ко мне в прогу) через зарегистрирований мной OnStarted()???  smile 

 smile 

(может кто сталкивался)

Это сообщение отредактировал(а) neosapient - 31.1.2008, 17:14
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0356 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.