Здравствуйте, m16, Вы писали:
m16>Здравствуйте, Odi$$ey, Вы писали:
OE>>насчет отдельного потока тоже пожалуй облом, окно-то с ActiveX живет в интерфейсном потоке. Тут разве что перед началом загрузки выводить клиенту картинку и пусть себе расслабляется...
m16>Попробовал размесить загрузку в отдельную нить (AfxBeginThread), но при вызове функций ActiveX программа вылетает. Выглядит это забавно. По верх главного окна приложения отображено сообщение о фатальной ошибке с предложением закрыть программу при этом можно работать с меню.
m16>Пожалуйста, подскажите, в чем дело? Как с этим бороться?
Создай на основном окне чайлдовый диалог, и хость этот ActiveX на нем.
Причем создавай этот диалог в отдельном потоке. Тогда замирать будет только этот диалог, а основное окно будет спокойно жить. Дергать методы ActiveX-а можно будет только из этого отдельного потока. Поэтому садишься и пишеш враппер/врапперы: из основного UI-шного потока SendMessage-ми посылается сообщение диалогу, с которым ты передаешь инфу о том, какой метод нужно вызвать и параметры для вызова. Диалог в своем message pump ловит мессагу, дергает ActiveX и возвращает результат.
Re[9]: Как в MFC заставить прорисовываться окна вовремя испо
Здравствуйте, rus blood, Вы писали:
RB>Вот пример. Можно и красивее, наверно. RB>Есть диалог на MFC. На нем кнопка. По нажатию кнопки делаем следующее.
RB>
RB>ЗЫ RB>atlbase нужна только для функции AtlWaitWithMessageLoop — ожидание с прокруткой сообщений. Ее можно просто скопировать себе и забыть об atlbase.
На параллельную нить я повесил прогрессбар.
Неожиданно всплыла такая проблема. В ситуации, когда времяемкую процедуру инициирует главное окно, то Прогрессбар рисуется, если же процедуру инициирует плавающая панель, то не прорисовывается, пока не будет выполнена процедура главного окна. Однако если перед этой времяемкой процедурой вставить messageBox, то Прогрессбар прорисовывается. Что делать?
Re[10]: Как в MFC заставить прорисовываться окна вовремя исп
m16>На параллельную нить я повесил прогрессбар. m16>Неожиданно всплыла такая проблема. В ситуации, когда времяемкую процедуру инициирует главное окно, то Прогрессбар рисуется, если же процедуру инициирует плавающая панель, то не прорисовывается, пока не будет выполнена процедура главного окна. Однако если перед этой времяемкой процедурой вставить messageBox, то Прогрессбар прорисовывается. Что делать?
Честно говоря не очень понятно, что значит "пока не будет выполнена процедура главного окна". Что за процедура?
И как вызывается MessageBox?
На самом деле код, который тут приведен, имеет проблемы с реентерабельностью, поскольку крутит цикл сообщений, следовательно, потенциально может отловить новую команду или уйти в модальное состояние (запущено меню, или открыт диалог).
Смысл цикла сообщений в том, что при создании child окна оно взаимодействует с родительским — посылает ему сообщения. Если эти сообщения не обработать, вызов CreateWindowEx для child окна блокируется.
ЗЫ Может быть тебе лучше создать ActiveX-контрол в отдельном потоке? А в основной поток промаршалить его IDispatch, чтобы дергать методы. Тогда у тебя не будет "мерзнуть" весь UI приложения.
Имею скафандр — готов путешествовать!
Re[11]: Как в MFC заставить прорисовываться окна вовремя исп
RB>Честно говоря не очень понятно, что значит "пока не будет выполнена процедура главного окна". Что за процедура? RB>И как вызывается MessageBox?
Суть в следующем:
В ActiveX есть некоторое дерево элементов, эта процедура пробегается по нему и формирует Уже мое дерево. Проблема в том, что эта процедура вызывается из обработчика кнопки и соответственно блокирует цикл обработки сообщений главного окна надолго. Как разблокировать главный цикл?
Параллельные потоки не подходят…
RB>Смысл цикла сообщений в том, что при создании child окна оно взаимодействует с родительским — посылает ему сообщения. Если эти сообщения не обработать, вызов CreateWindowEx для child окна блокируется.
А можно поподробнее..
Re[12]: Как в MFC заставить прорисовываться окна вовремя исп
m16>Суть в следующем: m16>В ActiveX есть некоторое дерево элементов, эта процедура пробегается по нему и формирует Уже мое дерево. Проблема в том, что эта процедура вызывается из обработчика кнопки и соответственно блокирует цикл обработки сообщений главного окна надолго. Как разблокировать главный цикл?
А эта процедура написана тобой? Или опять какой-то метод в ActiveX, который сам все делает?
RB>>Смысл цикла сообщений в том, что при создании child окна оно взаимодействует с родительским — посылает ему сообщения. Если эти сообщения не обработать, вызов CreateWindowEx для child окна блокируется.
m16>А можно поподробнее..
В приведенном примере основной поток вызывает крутит цикл сообщений и ждет сигнала от рабочего потока. Рабочий поток создает прогресс-бар и сигналит основному, что все ок. Если основной поток не будет крутит цикл сообщений и не будет ждать, пока прогресс-бар будет создан в рабочем потоке, то вызов функции Create для прогресс-бара блокируется.
Имею скафандр — готов путешествовать!
Re[13]: Как в MFC заставить прорисовываться окна вовремя исп
RB>В приведенном примере основной поток вызывает крутит цикл сообщений и ждет сигнала от рабочего потока. Рабочий поток создает прогресс-бар и сигналит основному, что все ок. Если основной поток не будет крутит цикл сообщений и не будет ждать, пока прогресс-бар будет создан в рабочем потоке, то вызов функции Create для прогресс-бара блокируется.
Похоже, что так и есть. Вопрос только в том, почему если эту штуку повесить на открытие отчета, то все нормально, а если на фильтрацию, то create прогрессбара блокируется?
Почему вызов MessageBox в главном или рабочем прочесе оказывает такое магическое воздействие? Подскажите что делать?
Re[14]: Как в MFC заставить прорисовываться окна вовремя исп
Здравствуйте, m16, Вы писали:
RB>>В приведенном примере основной поток вызывает крутит цикл сообщений и ждет сигнала от рабочего потока. Рабочий поток создает прогресс-бар и сигналит основному, что все ок. Если основной поток не будет крутит цикл сообщений и не будет ждать, пока прогресс-бар будет создан в рабочем потоке, то вызов функции Create для прогресс-бара блокируется.
m16>Похоже, что так и есть. Вопрос только в том, почему если эту штуку повесить на открытие отчета, то все нормально, а если на фильтрацию, то create прогрессбара блокируется?
"Открытие отчета" и "фильтрация" — это методы ActiveX контрола?
m16>Почему вызов MessageBox в главном или рабочем прочесе оказывает такое магическое воздействие? Подскажите что делать?
MessageBox переводит поток в модальное состояние — крутит цикл сообщений внутри себя.