Как в MFC заставить прорисовываться окна вовремя исполнения
От: Аноним  
Дата: 09.06.04 16:09
Оценка:
Как в MFC заставить прорисовываться окна вовремя исполнения времяемкой процедуры

Визуальный ActiveX повешен на дочернее окно. Загрузка данных в него занимает от 5 секунд до 3 минут. Во время загрузки данных окна программы не перерисовываются, их нельзя сворачивать разворачивать и т. д. Это происходит от того, что код загрузки размещен в обработчике нажатия кнопки. Посоветуете, как это исправить.
Залезть в процесс загрузки данных нет возможности, поскольку он спрятан во внутрь
ActiveX.
Re: Как в MFC заставить прорисовываться окна вовремя исполне
От: rus blood Россия  
Дата: 09.06.04 16:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как в 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 заставить прорисовываться окна вовремя испо
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 10.06.04 04:20
Оценка:
Здравствуйте, rus blood, Вы писали:

А>>Как в MFC заставить прорисовываться окна вовремя исполнения времяемкой процедуры


А>>Визуальный ActiveX повешен на дочернее окно. Загрузка данных в него занимает от 5 секунд до 3 минут. Во время загрузки данных окна программы не перерисовываются, их нельзя сворачивать разворачивать и т. д. Это происходит от того, что код загрузки размещен в обработчике нажатия кнопки. Посоветуете, как это исправить.

А>>Залезть в процесс загрузки данных нет возможности, поскольку он спрятан во внутрь
А>>ActiveX.

RB>Во время загрузки периодически pump-ить все message-и...


дык:

А>Залезть в процесс загрузки данных нет возможности, поскольку он спрятан во внутрь ActiveX.


насчет отдельного потока тоже пожалуй облом, окно-то с ActiveX живет в интерфейсном потоке. Тут разве что перед началом загрузки выводить клиенту картинку и пусть себе расслабляется...
Re[3]: Как в MFC заставить прорисовываться окна вовремя испо
От: m16  
Дата: 10.06.04 07:19
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>насчет отдельного потока тоже пожалуй облом, окно-то с ActiveX живет в интерфейсном потоке. Тут разве что перед началом загрузки выводить клиенту картинку и пусть себе расслабляется...


Попробовал размесить загрузку в отдельную нить (AfxBeginThread), но при вызове функций ActiveX программа вылетает. Выглядит это забавно. По верх главного окна приложения отображено сообщение о фатальной ошибке с предложением закрыть программу при этом можно работать с меню.

Пожалуйста, подскажите, в чем дело? Как с этим бороться?
Re[4]: Как в MFC заставить прорисовываться окна вовремя испо
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 10.06.04 09:35
Оценка:
Здравствуйте, m16, Вы писали:

m16>Попробовал размесить загрузку в отдельную нить (AfxBeginThread), но при вызове функций ActiveX программа вылетает. Выглядит это забавно. По верх главного окна приложения отображено сообщение о фатальной ошибке с предложением закрыть программу при этом можно работать с меню.


m16>Пожалуйста, подскажите, в чем дело?


возможно с тем, что из этой загрузки вызываются методы MFC-шного окна созданного в основном потоке, вот программа и склевает ласты

m16>Как с этим бороться?


ты в самом деле хочешь чтобы не дожидаясь конца загрузки юзер бы имел возможность давить на все кнопки и меню?
Re[5]: Как в MFC заставить прорисовываться окна вовремя испо
От: m16  
Дата: 10.06.04 10:37
Оценка:
Передо мной стоит следующая задача:

Имеется ActiveX компонент на документе. У него есть метод загрузки данных – черный ящик для нас. Типа ActivexObject.SetData(). Запускаем и все. Ждем.

У нас в приложении также есть ProgressBar (это не стандартный mfc-шный контрол, но типа того). Он реализован в отдельном потоке, запускаем его, и он пошел вертеть туда-сюда (количество прогресса нас не интересует, он просто туда сюда полосочку вертит, как в нетскейпе). Компонент размещен на статусной строке MainFrame’а.

Необходимо, чтобы пока выполняется метод загрузки данных ActiveX-а на документе, чтобы этот прогресс бар в статусе скакал.

Выполнение нашего метода загрузки данных блокирует обновление окна, т.е. прога фактически висит на это время. И, соответственно, ProgressBar тоже не обновляется.
Как сделать, чтобы обновлялся???
Re[6]: Как в MFC заставить прорисовываться окна вовремя испо
От: rus blood Россия  
Дата: 10.06.04 11:29
Оценка:
m16>Как сделать, чтобы обновлялся???

Выведи прогресс-бар в другой поток.
Имею скафандр — готов путешествовать!
Re[7]: Как в MFC заставить прорисовываться окна вовремя испо
От: m16  
Дата: 10.06.04 12:25
Оценка:
Здравствуйте, rus blood, Вы писали:

m16>>Как сделать, чтобы обновлялся???

RB>Выведи прогресс-бар в другой поток.

Вы предлагаете сделать второй интерфейсный поток. Таким образом, в программе будет два цикла обработки сообщений. Далее из второго потока создается прогресс бар и вешается на строку состояний, созданную в первом потоке.
Есть ли у кого-нибудь пример?
Re[8]: Как в MFC заставить прорисовываться окна вовремя испо
От: rus blood Россия  
Дата: 10.06.04 13:36
Оценка:
Здравствуйте, m16, Вы писали:

m16>Здравствуйте, rus blood, Вы писали:


m16>>>Как сделать, чтобы обновлялся???

RB>>Выведи прогресс-бар в другой поток.

m16>Вы предлагаете сделать второй интерфейсный поток. Таким образом, в программе будет два цикла обработки сообщений. Далее из второго потока создается прогресс бар и вешается на строку состояний, созданную в первом потоке.

m16>Есть ли у кого-нибудь пример?

Вот пример. Можно и красивее, наверно.
Есть диалог на MFC. На нем кнопка. По нажатию кнопки делаем следующее.

#include <process.h>
#include <atlbase.h>
...........

struct ThreadData
{
    CTestMFCDlg*    pDlg;
    HANDLE            hEvent;
};

UINT __stdcall ThreadProc(void* lParam)
{
    ThreadData* pstData = (ThreadData*)lParam;
    CTestMFCDlg* pDlg = pstData->pDlg;
    HANDLE hEvent = pstData->hEvent;

    CProgressCtrl ctrl;
    ctrl.Create(WS_CHILD|WS_VISIBLE, CRect(10, 10, 100, 30), pDlg, 101);
    ctrl.SetRange(0, 100);
    ctrl.SetPos(0);

    SetEvent(hEvent);

    UINT nTimer = ctrl.SetTimer(1, 100, NULL);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (WM_TIMER == msg.message && msg.wParam == nTimer)
            ctrl.SetPos(ctrl.GetPos() + 1);
        DispatchMessage(&msg);
    }

    ctrl.KillTimer(nTimer);
    ctrl.DestroyWindow();

    return 0;
}

void CTestMFCDlg::OnButton1() 
{
    ThreadData stData;
    stData.pDlg = this;
    stData.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

    UINT nID;
    HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadProc, &stData, 0, &nID);

    AtlWaitWithMessageLoop(stData.hEvent);
    CloseHandle(stData.hEvent);

    Sleep(10000);    //  мертвый код. Вызываем ActiveX

    ::PostThreadMessage(nID, WM_QUIT, 0, 0);
    AtlWaitWithMessageLoop(hThread);
    CloseHandle(hThread);
}


ЗЫ
atlbase нужна только для функции AtlWaitWithMessageLoop — ожидание с прокруткой сообщений. Ее можно просто скопировать себе и забыть об atlbase.
Имею скафандр — готов путешествовать!
Re[6]: Как в MFC заставить прорисовываться окна вовремя испо
От: Михаил  
Дата: 11.06.04 03:08
Оценка:
Здравствуйте, m16, Вы писали:

m16>Передо мной стоит следующая задача:


m16>Имеется ActiveX компонент на документе. У него есть метод загрузки данных – черный ящик для нас. Типа ActivexObject.SetData(). Запускаем и все. Ждем.


ActiveX должен генерить event'ы о ходе загрузки. Проверь, их точно нет или может они скрыты, недокументированы?
Это нормальная практика в таких ситуациях.
Все остальное — лечение сифилиса вазелином.
...А отсюда наливаем, когда рецепт написан совсем неразборчиво...
Re[9]: Как в MFC заставить прорисовываться окна вовремя испо
От: m16  
Дата: 11.06.04 07:12
Оценка:
Вовремя линковки выскакивает ошибка «error LNK2001: unresolved external symbol "unsigned long __cdecl _beginthreadex(void *,unsigned int,unsigned in …..»
Какой lib нужно прилинковать?
Re[10]: Как в MFC заставить прорисовываться окна вовремя исп
От: rus blood Россия  
Дата: 11.06.04 07:53
Оценка:
Здравствуйте, m16, Вы писали:



m16>Вовремя линковки выскакивает ошибка «error LNK2001: unresolved external symbol "unsigned long __cdecl _beginthreadex(void *,unsigned int,unsigned in …..»

m16>Какой lib нужно прилинковать?

1. Посмотри в MSDN, там должно быть.
2. Замени на CreateThread. Здесь это не принципиально.
Имею скафандр — готов путешествовать!
Re[10]: Как в MFC заставить прорисовываться окна вовремя исп
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 11.06.04 08:03
Оценка:
Здравствуйте, 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 заставить прорисовываться окна вовремя испо
От: m16  
Дата: 11.06.04 12:05
Оценка:
Используя этот код, мне удалось разместить прогрессбар в статусную строку. Он двигается и все такое. Однако CmainFrame все равно не обновляется. Если поверх главного окна разместить любое другое, а затем свернуть, то обновится только, прогрессбар, а остальная часть mainframe будет того же цвета, что и окно, которым его накрывали. И второй глюк, если вовремя загрузки данных в ActiveX нажать кнопку «свернуть» главного окна , то окно свернется по окончанию загрузки и программа повиснет. Подскажите, что делать?
Re[7]: Как в MFC заставить прорисовываться окна вовремя испо
От: m16  
Дата: 11.06.04 12:10
Оценка:
М>ActiveX должен генерить event'ы о ходе загрузки. Проверь, их точно нет или может они скрыты, недокументированы?
М>Это нормальная практика в таких ситуациях.

Не совсем понятно, найду я такое сообщение и как мне его обработать, ведь цикл обработки сообщений заблокирован процедурой загрузки данных в ActiveX?
Re[10]: Как в MFC заставить прорисовываться окна вовремя исп
От: rus blood Россия  
Дата: 11.06.04 12:22
Оценка:
Здравствуйте, m16, Вы писали:

m16>Используя этот код, мне удалось разместить прогрессбар в статусную строку. Он двигается и все такое. Однако CmainFrame все равно не обновляется. Если поверх главного окна разместить любое другое, а затем свернуть, то обновится только, прогрессбар, а остальная часть mainframe будет того же цвета, что и окно, которым его накрывали. И второй глюк, если вовремя загрузки данных в ActiveX нажать кнопку «свернуть» главного окна , то окно свернется по окончанию загрузки и программа повиснет. Подскажите, что делать?



Необходимо, чтобы пока выполняется метод загрузки данных ActiveX-а на документе, чтобы этот прогресс бар в статусе скакал.

Выполнение нашего метода загрузки данных блокирует обновление окна, т.е. прога фактически висит на это время. И, соответственно, ProgressBar тоже не обновляется.
Как сделать, чтобы обновлялся???


А что ты хотел еще? Ничего больше ты не сделаешь. Основное окно заблокировано ActiveX-контролом, и ты его никак не заставишь нарисоваться. Если только поверх него будешь сам все рисовать...
Имею скафандр — готов путешествовать!
Re[8]: Как в MFC заставить прорисовываться окна вовремя испо
От: rus blood Россия  
Дата: 11.06.04 12:24
Оценка:
m16>Не совсем понятно, найду я такое сообщение и как мне его обработать, ведь цикл обработки сообщений заблокирован процедурой загрузки данных в ActiveX?

Если ActiveX действительно генерирует события, то скорее всего, рассылка событий будет идти этим же потоком. Соответственно, подписавшись на него и поймав это событие, ты делаешь прокачку сообщений...

Так что, поискать стоит...
Имею скафандр — готов путешествовать!
Re[9]: Как в MFC заставить прорисовываться окна вовремя испо
От: Михаил  
Дата: 15.06.04 00:31
Оценка:
Даже более того.
Во-первых этот ActiveX — на 100% черный ящик?
Есть подробная документация, исходники?
Если его вставить (можно ли?) на Web-страницу, он завесит explorer во время загрузки?
Если не завесит — надо разбираться почему.
Есть еще 2 варианта.
1. Если этот activeX апгрейдился из DLL — возможно, в нем остались call-back функции, которые не доросли до полноценных event-ов. Но без доки или исходников вряд ли их получится найти.
2. Кроме event-ов, он может слать родителю какие-нибудь сообщения, типа WM_USER или WM_COPYDATA (или что угодно может быть). Без доки их отловить вполне реально через Spy++. Потом родителю останется вставить обработчик сообщения...
Из остальных постов понятно, что дальше делать.
...А отсюда наливаем, когда рецепт написан совсем неразборчиво...
Re[4]: Как в MFC заставить прорисовываться окна вовремя испо
От: BlackSpy  
Дата: 15.06.04 06:57
Оценка:
Здравствуйте, m16, Вы писали:

m16>Здравствуйте, Odi$$ey, Вы писали:


OE>>насчет отдельного потока тоже пожалуй облом, окно-то с ActiveX живет в интерфейсном потоке. Тут разве что перед началом загрузки выводить клиенту картинку и пусть себе расслабляется...


m16>Попробовал размесить загрузку в отдельную нить (AfxBeginThread), но при вызове функций ActiveX программа вылетает. Выглядит это забавно. По верх главного окна приложения отображено сообщение о фатальной ошибке с предложением закрыть программу при этом можно работать с меню.


m16>Пожалуйста, подскажите, в чем дело? Как с этим бороться?



CoInitialize() ???
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.