Как в MFC заставить прорисовываться окна вовремя исполнения
От:
Аноним
Дата:
09.06.04 16:09
Оценка:
Как в MFC заставить прорисовываться окна вовремя исполнения времяемкой процедуры
Визуальный ActiveX повешен на дочернее окно. Загрузка данных в него занимает от 5 секунд до 3 минут. Во время загрузки данных окна программы не перерисовываются, их нельзя сворачивать разворачивать и т. д. Это происходит от того, что код загрузки размещен в обработчике нажатия кнопки. Посоветуете, как это исправить.
Залезть в процесс загрузки данных нет возможности, поскольку он спрятан во внутрь
ActiveX.
Re: Как в MFC заставить прорисовываться окна вовремя исполне
Здравствуйте, Аноним, Вы писали:
А>Как в MFC заставить прорисовываться окна вовремя исполнения времяемкой процедуры
А>Визуальный ActiveX повешен на дочернее окно. Загрузка данных в него занимает от 5 секунд до 3 минут. Во время загрузки данных окна программы не перерисовываются, их нельзя сворачивать разворачивать и т. д. Это происходит от того, что код загрузки размещен в обработчике нажатия кнопки. Посоветуете, как это исправить. А>Залезть в процесс загрузки данных нет возможности, поскольку он спрятан во внутрь А>ActiveX.
Во время загрузки периодически pump-ить все message-и...
Имею скафандр — готов путешествовать!
Re[2]: Как в MFC заставить прорисовываться окна вовремя испо
От:
Аноним
Дата:
09.06.04 16:22
Оценка:
Здравствуйте, rus blood, Вы писали:
RB>Здравствуйте, Аноним, Вы писали:
А>>Как в MFC заставить прорисовываться окна вовремя исполнения времяемкой процедуры
А>>Визуальный ActiveX повешен на дочернее окно. Загрузка данных в него занимает от 5 секунд до 3 минут. Во время загрузки данных окна программы не перерисовываются, их нельзя сворачивать разворачивать и т. д. Это происходит от того, что код загрузки размещен в обработчике нажатия кнопки. Посоветуете, как это исправить. А>>Залезть в процесс загрузки данных нет возможности, поскольку он спрятан во внутрь А>>ActiveX.
RB>Во время загрузки периодически pump-ить все message-и...
переодически это как часто?
если миллиард итераций в цикле, то либо миллиард пампов либо миллиард сравнений и сложений.
лучше все-таки в поток вычисления вынести.
Re[2]: Как в MFC заставить прорисовываться окна вовремя испо
Здравствуйте, rus blood, Вы писали:
А>>Как в MFC заставить прорисовываться окна вовремя исполнения времяемкой процедуры
А>>Визуальный ActiveX повешен на дочернее окно. Загрузка данных в него занимает от 5 секунд до 3 минут. Во время загрузки данных окна программы не перерисовываются, их нельзя сворачивать разворачивать и т. д. Это происходит от того, что код загрузки размещен в обработчике нажатия кнопки. Посоветуете, как это исправить. А>>Залезть в процесс загрузки данных нет возможности, поскольку он спрятан во внутрь А>>ActiveX.
RB>Во время загрузки периодически pump-ить все message-и...
дык:
А>Залезть в процесс загрузки данных нет возможности, поскольку он спрятан во внутрь ActiveX.
насчет отдельного потока тоже пожалуй облом, окно-то с ActiveX живет в интерфейсном потоке. Тут разве что перед началом загрузки выводить клиенту картинку и пусть себе расслабляется...
Re[3]: Как в MFC заставить прорисовываться окна вовремя испо
Здравствуйте, Odi$$ey, Вы писали:
OE>насчет отдельного потока тоже пожалуй облом, окно-то с ActiveX живет в интерфейсном потоке. Тут разве что перед началом загрузки выводить клиенту картинку и пусть себе расслабляется...
Попробовал размесить загрузку в отдельную нить (AfxBeginThread), но при вызове функций ActiveX программа вылетает. Выглядит это забавно. По верх главного окна приложения отображено сообщение о фатальной ошибке с предложением закрыть программу при этом можно работать с меню.
Пожалуйста, подскажите, в чем дело? Как с этим бороться?
Re[4]: Как в MFC заставить прорисовываться окна вовремя испо
Здравствуйте, m16, Вы писали:
m16>Попробовал размесить загрузку в отдельную нить (AfxBeginThread), но при вызове функций ActiveX программа вылетает. Выглядит это забавно. По верх главного окна приложения отображено сообщение о фатальной ошибке с предложением закрыть программу при этом можно работать с меню.
m16>Пожалуйста, подскажите, в чем дело?
возможно с тем, что из этой загрузки вызываются методы MFC-шного окна созданного в основном потоке, вот программа и склевает ласты
m16>Как с этим бороться?
ты в самом деле хочешь чтобы не дожидаясь конца загрузки юзер бы имел возможность давить на все кнопки и меню?
Re[5]: Как в MFC заставить прорисовываться окна вовремя испо
Имеется ActiveX компонент на документе. У него есть метод загрузки данных – черный ящик для нас. Типа ActivexObject.SetData(). Запускаем и все. Ждем.
У нас в приложении также есть ProgressBar (это не стандартный mfc-шный контрол, но типа того). Он реализован в отдельном потоке, запускаем его, и он пошел вертеть туда-сюда (количество прогресса нас не интересует, он просто туда сюда полосочку вертит, как в нетскейпе). Компонент размещен на статусной строке MainFrame’а.
Необходимо, чтобы пока выполняется метод загрузки данных ActiveX-а на документе, чтобы этот прогресс бар в статусе скакал.
Выполнение нашего метода загрузки данных блокирует обновление окна, т.е. прога фактически висит на это время. И, соответственно, ProgressBar тоже не обновляется.
Как сделать, чтобы обновлялся???
Re[6]: Как в MFC заставить прорисовываться окна вовремя испо
Здравствуйте, rus blood, Вы писали:
m16>>Как сделать, чтобы обновлялся??? RB>Выведи прогресс-бар в другой поток.
Вы предлагаете сделать второй интерфейсный поток. Таким образом, в программе будет два цикла обработки сообщений. Далее из второго потока создается прогресс бар и вешается на строку состояний, созданную в первом потоке.
Есть ли у кого-нибудь пример?
Re[8]: Как в MFC заставить прорисовываться окна вовремя испо
Здравствуйте, m16, Вы писали:
m16>Здравствуйте, rus blood, Вы писали:
m16>>>Как сделать, чтобы обновлялся??? RB>>Выведи прогресс-бар в другой поток.
m16>Вы предлагаете сделать второй интерфейсный поток. Таким образом, в программе будет два цикла обработки сообщений. Далее из второго потока создается прогресс бар и вешается на строку состояний, созданную в первом потоке. m16>Есть ли у кого-нибудь пример?
Вот пример. Можно и красивее, наверно.
Есть диалог на MFC. На нем кнопка. По нажатию кнопки делаем следующее.
Здравствуйте, m16, Вы писали:
m16>Передо мной стоит следующая задача:
m16>Имеется ActiveX компонент на документе. У него есть метод загрузки данных – черный ящик для нас. Типа ActivexObject.SetData(). Запускаем и все. Ждем.
ActiveX должен генерить event'ы о ходе загрузки. Проверь, их точно нет или может они скрыты, недокументированы?
Это нормальная практика в таких ситуациях.
Все остальное — лечение сифилиса вазелином.
...А отсюда наливаем, когда рецепт написан совсем неразборчиво...
Re[9]: Как в MFC заставить прорисовываться окна вовремя испо
Вовремя линковки выскакивает ошибка «error LNK2001: unresolved external symbol "unsigned long __cdecl _beginthreadex(void *,unsigned int,unsigned in …..»
Какой lib нужно прилинковать?
Re[10]: Как в MFC заставить прорисовываться окна вовремя исп
Здравствуйте, m16, Вы писали:
m16>Вовремя линковки выскакивает ошибка «error LNK2001: unresolved external symbol "unsigned long __cdecl _beginthreadex(void *,unsigned int,unsigned in …..» m16>Какой lib нужно прилинковать?
Свойства проекта — С++ — Code Generation — Runtime Library — должно быть Multi-threaded xxx
Re[9]: Как в MFC заставить прорисовываться окна вовремя испо
Используя этот код, мне удалось разместить прогрессбар в статусную строку. Он двигается и все такое. Однако CmainFrame все равно не обновляется. Если поверх главного окна разместить любое другое, а затем свернуть, то обновится только, прогрессбар, а остальная часть mainframe будет того же цвета, что и окно, которым его накрывали. И второй глюк, если вовремя загрузки данных в ActiveX нажать кнопку «свернуть» главного окна , то окно свернется по окончанию загрузки и программа повиснет. Подскажите, что делать?
Re[7]: Как в MFC заставить прорисовываться окна вовремя испо
М>ActiveX должен генерить event'ы о ходе загрузки. Проверь, их точно нет или может они скрыты, недокументированы? М>Это нормальная практика в таких ситуациях.
Не совсем понятно, найду я такое сообщение и как мне его обработать, ведь цикл обработки сообщений заблокирован процедурой загрузки данных в ActiveX?
Re[10]: Как в MFC заставить прорисовываться окна вовремя исп
Здравствуйте, m16, Вы писали:
m16>Используя этот код, мне удалось разместить прогрессбар в статусную строку. Он двигается и все такое. Однако CmainFrame все равно не обновляется. Если поверх главного окна разместить любое другое, а затем свернуть, то обновится только, прогрессбар, а остальная часть mainframe будет того же цвета, что и окно, которым его накрывали. И второй глюк, если вовремя загрузки данных в ActiveX нажать кнопку «свернуть» главного окна , то окно свернется по окончанию загрузки и программа повиснет. Подскажите, что делать?
Необходимо, чтобы пока выполняется метод загрузки данных ActiveX-а на документе, чтобы этот прогресс бар в статусе скакал.
Выполнение нашего метода загрузки данных блокирует обновление окна, т.е. прога фактически висит на это время. И, соответственно, ProgressBar тоже не обновляется. Как сделать, чтобы обновлялся???
А что ты хотел еще? Ничего больше ты не сделаешь. Основное окно заблокировано ActiveX-контролом, и ты его никак не заставишь нарисоваться. Если только поверх него будешь сам все рисовать...
Имею скафандр — готов путешествовать!
Re[8]: Как в MFC заставить прорисовываться окна вовремя испо
m16>Не совсем понятно, найду я такое сообщение и как мне его обработать, ведь цикл обработки сообщений заблокирован процедурой загрузки данных в ActiveX?
Если ActiveX действительно генерирует события, то скорее всего, рассылка событий будет идти этим же потоком. Соответственно, подписавшись на него и поймав это событие, ты делаешь прокачку сообщений...
Так что, поискать стоит...
Имею скафандр — готов путешествовать!
Re[9]: Как в MFC заставить прорисовываться окна вовремя испо
Даже более того.
Во-первых этот ActiveX — на 100% черный ящик?
Есть подробная документация, исходники?
Если его вставить (можно ли?) на Web-страницу, он завесит explorer во время загрузки?
Если не завесит — надо разбираться почему.
Есть еще 2 варианта.
1. Если этот activeX апгрейдился из DLL — возможно, в нем остались call-back функции, которые не доросли до полноценных event-ов. Но без доки или исходников вряд ли их получится найти.
2. Кроме event-ов, он может слать родителю какие-нибудь сообщения, типа WM_USER или WM_COPYDATA (или что угодно может быть). Без доки их отловить вполне реально через Spy++. Потом родителю останется вставить обработчик сообщения...
Из остальных постов понятно, что дальше делать.
...А отсюда наливаем, когда рецепт написан совсем неразборчиво...
Re[4]: Как в MFC заставить прорисовываться окна вовремя испо
Здравствуйте, m16, Вы писали:
m16>Здравствуйте, Odi$$ey, Вы писали:
OE>>насчет отдельного потока тоже пожалуй облом, окно-то с ActiveX живет в интерфейсном потоке. Тут разве что перед началом загрузки выводить клиенту картинку и пусть себе расслабляется...
m16>Попробовал размесить загрузку в отдельную нить (AfxBeginThread), но при вызове функций ActiveX программа вылетает. Выглядит это забавно. По верх главного окна приложения отображено сообщение о фатальной ошибке с предложением закрыть программу при этом можно работать с меню.
m16>Пожалуйста, подскажите, в чем дело? Как с этим бороться?