Как в 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() ???
Re[4]: Как в MFC заставить прорисовываться окна вовремя испо
От: BlackSpy  
Дата: 15.06.04 07:12
Оценка:
Здравствуйте, m16, Вы писали:

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


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


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


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



Создай на основном окне чайлдовый диалог, и хость этот ActiveX на нем.
Причем создавай этот диалог в отдельном потоке. Тогда замирать будет только этот диалог, а основное окно будет спокойно жить. Дергать методы ActiveX-а можно будет только из этого отдельного потока. Поэтому садишься и пишеш враппер/врапперы: из основного UI-шного потока SendMessage-ми посылается сообщение диалогу, с которым ты передаешь инфу о том, какой метод нужно вызвать и параметры для вызова. Диалог в своем message pump ловит мессагу, дергает ActiveX и возвращает результат.
Re[9]: Как в MFC заставить прорисовываться окна вовремя испо
От: m16  
Дата: 16.06.04 14:28
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Вот пример. Можно и красивее, наверно.

RB>Есть диалог на MFC. На нем кнопка. По нажатию кнопки делаем следующее.

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

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

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

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

RB>    SetEvent(hEvent);

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

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

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

RB>    return 0;
RB>}

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

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

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

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

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


RB>ЗЫ

RB>atlbase нужна только для функции AtlWaitWithMessageLoop — ожидание с прокруткой сообщений. Ее можно просто скопировать себе и забыть об atlbase.


На параллельную нить я повесил прогрессбар.
Неожиданно всплыла такая проблема. В ситуации, когда времяемкую процедуру инициирует главное окно, то Прогрессбар рисуется, если же процедуру инициирует плавающая панель, то не прорисовывается, пока не будет выполнена процедура главного окна. Однако если перед этой времяемкой процедурой вставить messageBox, то Прогрессбар прорисовывается. Что делать?
Re[10]: Как в MFC заставить прорисовываться окна вовремя исп
От: rus blood Россия  
Дата: 16.06.04 14:56
Оценка:
Здравствуйте, m16, Вы писали:


RB>>
overquoting
RB>>



m16>На параллельную нить я повесил прогрессбар.

m16>Неожиданно всплыла такая проблема. В ситуации, когда времяемкую процедуру инициирует главное окно, то Прогрессбар рисуется, если же процедуру инициирует плавающая панель, то не прорисовывается, пока не будет выполнена процедура главного окна. Однако если перед этой времяемкой процедурой вставить messageBox, то Прогрессбар прорисовывается. Что делать?

Честно говоря не очень понятно, что значит "пока не будет выполнена процедура главного окна". Что за процедура?
И как вызывается MessageBox?

На самом деле код, который тут приведен, имеет проблемы с реентерабельностью, поскольку крутит цикл сообщений, следовательно, потенциально может отловить новую команду или уйти в модальное состояние (запущено меню, или открыт диалог).

Смысл цикла сообщений в том, что при создании child окна оно взаимодействует с родительским — посылает ему сообщения. Если эти сообщения не обработать, вызов CreateWindowEx для child окна блокируется.

ЗЫ Может быть тебе лучше создать ActiveX-контрол в отдельном потоке? А в основной поток промаршалить его IDispatch, чтобы дергать методы. Тогда у тебя не будет "мерзнуть" весь UI приложения.
Имею скафандр — готов путешествовать!
Re[11]: Как в MFC заставить прорисовываться окна вовремя исп
От: m16  
Дата: 16.06.04 15:23
Оценка:
RB>Честно говоря не очень понятно, что значит "пока не будет выполнена процедура главного окна". Что за процедура?
RB>И как вызывается MessageBox?

Суть в следующем:
В ActiveX есть некоторое дерево элементов, эта процедура пробегается по нему и формирует Уже мое дерево. Проблема в том, что эта процедура вызывается из обработчика кнопки и соответственно блокирует цикл обработки сообщений главного окна надолго. Как разблокировать главный цикл?

Параллельные потоки не подходят…


RB>Смысл цикла сообщений в том, что при создании child окна оно взаимодействует с родительским — посылает ему сообщения. Если эти сообщения не обработать, вызов CreateWindowEx для child окна блокируется.


А можно поподробнее..
Re[12]: Как в MFC заставить прорисовываться окна вовремя исп
От: rus blood Россия  
Дата: 16.06.04 15:46
Оценка:
m16>Суть в следующем:
m16>В ActiveX есть некоторое дерево элементов, эта процедура пробегается по нему и формирует Уже мое дерево. Проблема в том, что эта процедура вызывается из обработчика кнопки и соответственно блокирует цикл обработки сообщений главного окна надолго. Как разблокировать главный цикл?

А эта процедура написана тобой? Или опять какой-то метод в ActiveX, который сам все делает?


RB>>Смысл цикла сообщений в том, что при создании child окна оно взаимодействует с родительским — посылает ему сообщения. Если эти сообщения не обработать, вызов CreateWindowEx для child окна блокируется.


m16>А можно поподробнее..


В приведенном примере основной поток вызывает крутит цикл сообщений и ждет сигнала от рабочего потока. Рабочий поток создает прогресс-бар и сигналит основному, что все ок. Если основной поток не будет крутит цикл сообщений и не будет ждать, пока прогресс-бар будет создан в рабочем потоке, то вызов функции Create для прогресс-бара блокируется.
Имею скафандр — готов путешествовать!
Re[13]: Как в MFC заставить прорисовываться окна вовремя исп
От: m16  
Дата: 17.06.04 06:52
Оценка:
RB>А эта процедура написана тобой? Или опять какой-то метод в ActiveX, который сам все делает?

Эта процедура написана мной. В ней содержится каскад циклов, в котором идет чтение данных из ActiveX
Re[14]: Как в MFC заставить прорисовываться окна вовремя исп
От: rus blood Россия  
Дата: 17.06.04 07:09
Оценка:
m16>Эта процедура написана мной. В ней содержится каскад циклов, в котором идет чтение данных из ActiveX

Тогда ответ тебе уже дан
Автор: Odi$$ey
Дата: 16.06.04
.
Вызывай эту функцию в каждой итерации каждого цикла.
Имею скафандр — готов путешествовать!
Re[13]: Как в MFC заставить прорисовываться окна вовремя исп
От: m16  
Дата: 17.06.04 07:42
Оценка:
RB>В приведенном примере основной поток вызывает крутит цикл сообщений и ждет сигнала от рабочего потока. Рабочий поток создает прогресс-бар и сигналит основному, что все ок. Если основной поток не будет крутит цикл сообщений и не будет ждать, пока прогресс-бар будет создан в рабочем потоке, то вызов функции Create для прогресс-бара блокируется.


Похоже, что так и есть. Вопрос только в том, почему если эту штуку повесить на открытие отчета, то все нормально, а если на фильтрацию, то create прогрессбара блокируется?
Почему вызов MessageBox в главном или рабочем прочесе оказывает такое магическое воздействие? Подскажите что делать?
Re[14]: Как в MFC заставить прорисовываться окна вовремя исп
От: rus blood Россия  
Дата: 17.06.04 10:02
Оценка:
Здравствуйте, m16, Вы писали:

RB>>В приведенном примере основной поток вызывает крутит цикл сообщений и ждет сигнала от рабочего потока. Рабочий поток создает прогресс-бар и сигналит основному, что все ок. Если основной поток не будет крутит цикл сообщений и не будет ждать, пока прогресс-бар будет создан в рабочем потоке, то вызов функции Create для прогресс-бара блокируется.



m16>Похоже, что так и есть. Вопрос только в том, почему если эту штуку повесить на открытие отчета, то все нормально, а если на фильтрацию, то create прогрессбара блокируется?

"Открытие отчета" и "фильтрация" — это методы ActiveX контрола?

m16>Почему вызов MessageBox в главном или рабочем прочесе оказывает такое магическое воздействие? Подскажите что делать?

MessageBox переводит поток в модальное состояние — крутит цикл сообщений внутри себя.
Имею скафандр — готов путешествовать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.