Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Собственные потоки(threads) в СОМ объекте  (Прочитано 6862 раз)
0 Пользователей и 1 Гость смотрят эту тему.
CrazyRabbit
Участник

il
Offline Offline

« : 27-11-2003 01:17 » 

Что имеем:

Есть объект ( даже, точнее - СОМ объект ).
Пользует его IExplorer в Win2k или WinXP, если это важно.
Этот объект для выполнения доооолгой работы создает Объект-Поток (Поток дальше). Есть свой класс-обертка для _beginthreadex.
Поток, для информирования пользователя, имеет окно с progress bar-ом, может терять фокус и закрываться другим окнами, в т.ч. самим IExplorer -ом. Также, имеет кнопочку "Cansel" и "крестик" Улыбаюсь, т.е.  пользователь может прервать эту дооооооооолгую работу.

Что хотим:

При закрытии IExplorer -а, или процесса - владельца СОМ объекта, показать пользователю ("вывести вперед" окно с прогрессом) , что доооооооолгая работа еще не завершена! И  он может дождаться ее завершения или прервать ...

Что испробовано:

СОМ объект имеет Интерфейсный (IDispatch) метод Close, или OnDestroy() хендел, в крайнем случае.
Поток имеет переменную, которую проверяет периодически:), а, также естественно, интрфейс для установки этой переменной.
СОМ объект "ставит в известность" Поток и ждет его завершения -

while(Проверили)
{
::SwitchToThread(); //дали и младшеньким поработать Улыбаюсь
Sleep(SLEEP_TIME); //пошли спать
}


Как выглядит проблема:
При ожидании его завершения, Поток СОВСЕМ перестает работать ( ставил внутри печать, и точки прерывания даже).

Ждать пробовал в другой функции.  Из Close() посылал сам себе user_defined_message, и в его обработчике ждал.

Приветсвуется любые вопросы, ссылки (можно на английском ессно:), идеии , в конце концов !
Где искать?
Записан
CrazyRabbit
Участник

il
Offline Offline

« Ответ #1 : 27-11-2003 10:55 » 

Эй ! Народ !
Что так тихо?

Гром, в приватной беседе, предложил перехватить WM_DESTROY .
Посмотрю, что можно сделать. Хотя, функция  OnDestroy(...) как раз  и зовется когда получаю WM_DESTROY , а там я ждать пробовал. В таком же цикле, как описывал.
Говорю же, впечатление, что Поток перестает "получать процессор" вообще. Его относительный приоритет поднимать тоже пытался, до THREAD_PRIORITY_HIGHEST.
Записан
CrazyRabbit
Участник

il
Offline Offline

« Ответ #2 : 10-12-2003 00:35 » 

После почти 2-х недельного "перерыва" возвращаюсь к поднятой проблеме.

В свете накопленных данных изменил тему. Может, хоть так кто знающий заглянет Улыбаюсь

Исследования показали, что поблема, похоже, в окне с прогрессом.
Об этом окне:
"Поток" имеет
CMyProgress m_ProgressWindow;

Который в проекте определен как

class CMyProgress :
       public CAxDialogImpl<CProgressUpload>
{
...
}

Этот m_ProgressWindow "Поток" создает в конструкторе и удаляет в деструкторе Улыбаюсь. А при работе показывает или скрывает по надобности.

Так вот. Если в рабочей функции потока есть обращения к m_ProgressWindow , то  он, как я уже сказал, не выполняется, если при этом мы ждем(WaitForSingleObject) его завершения в "основном" СОМ объекте.
Такое впечатление, что и "основной СОМ объект"  и m_ProgressWindow принадлежат одному потоку...

Существует такое понятие как "Апартаменты в модели СОМ" .
То что я на сегодня понял, там рассказывается о том как объяснить клиенту СОМ объекта куда помещать сам этот объект, и как объявить его для работы в разных потоках.

У меня же такой случай:
Сам СОМ объект запускает отдельный Поток , имеющий окно с прогрессом, и должен дождаться звершения этого Потока!
Это "окно с прогрессом" служит как для индикации работы Потока , так и для его прерывания.
Записан
CrazyRabbit
Участник

il
Offline Offline

« Ответ #3 : 18-12-2003 02:09 » 

Всем спасибо за проявленое внимание!
Вопрос считаю закрытым! Проблему - решенной ! Отлично

Коротко:

"Основной" СОМ объект и Прогресс-Окно принадлежат одному потоку (пользоавтельскому интерфейсу). Не совсем правильная формулировка.
Когда я садился ожидать(WaitForSingleObject) завершения Потока в "основном" объекте,  то прекращалась обработка сообщений пользовательского интерфейса.

Это решается созданием собственного цикла выборки сообщений. Описано у Рихтера в 26 главе. Фунции API MsgWaitForMultipleObjects  and MsgWaitForMultipleObjectsEx.
Или для MFC - MSDN-овский топик  "Idle Loop Processing". О недокументированоой функции "CWinThread::PumpMessage()"
Также есть реализации разных пргрессов на codeguru.com
http://codeguru.earthweb.com/controls/progress_wnd2.shtml
http://codeguru.earthweb.com/controls/progress_wnd.shtml
и так далее.

Извиняюсь за сумбурное описание:D . Сейчас уже 4 часа ночи Жаль.  
Если есть вопросы - попробую ответить. Только, предупреждаю, не "в тот же день". Отлично
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines