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.
Имею скафандр — готов путешествовать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.