MFC의 스레드에서 상태 표시 줄의 창 텍스트를 변경하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/391125

문제

CStatusbar와 MFC에 대화 상자가 있습니다. 별도의 스레드에서는 상태 표시 줄의 창 텍스트를 변경하고 싶습니다. 그러나 MFC가 Asserts에 불만을 제기합니까? 어떻게 끝났습니까? 예제 코드가 좋을 것입니다.

도움이 되었습니까?

해결책

메인 프레임 창에 개인 메시지를 게시하고 상태 표시 줄을 업데이트하도록 '요청'할 수 있습니다. 스레드는 기본 창 핸들이 필요합니다 (CWND 객체는 스레드 안전하지 않으므로 사용하지 마십시오). 다음은 샘플 코드입니다.

static UINT CMainFrame::UpdateStatusBarProc(LPVOID pParam);

void CMainFrame::OnCreateTestThread()
{
    // Create the thread and pass the window handle
    AfxBeginThread(UpdateStatusBarProc, m_hWnd);
}

LRESULT CMainFrame::OnUser(WPARAM wParam, LPARAM)
{
    // Load string and update status bar
    CString str;
    VERIFY(str.LoadString(wParam));
    m_wndStatusBar.SetPaneText(0, str);
    return 0;
}

// Thread proc
UINT CMainFrame::UpdateStatusBarProc(LPVOID pParam)
{
    const HWND hMainFrame = reinterpret_cast<HWND>(pParam);
    ASSERT(hMainFrame != NULL);
    ::PostMessage(hMainFrame, WM_USER, IDS_STATUS_STRING);
    return 0;
}

집에서 컴파일러에 액세스 할 수 없으므로 코드는 메모리에서 나옵니다. 이제 오류에 대해 사과드립니다.

사용하는 대신 WM_USER 자신의 Windows 메시지를 등록 할 수 있습니다.

UINT WM_MY_MESSAGE = ::RegisterWindowsMessage(_T("WM_MY_MESSAGE"));

위의 정적 멤버로 만드십시오 CMainFrame 예를 들어.

문자열 리소스를 사용하는 경우 스레드가 힙에 문자열을 할당하고 CMainFrame 업데이트 기능이 삭제해야합니다.

// Thread proc
UINT CMainFrame::UpdateStatusBarProc(LPVOID pParam)
{
    const HWND hMainFrame = reinterpret_cast<HWND>(pParam);
    ASSERT(hMainFrame != NULL);
    CString* pString = new CString;
    *pString = _T("Hello, world!");
    ::PostMessage(hMainFrame, WM_USER, 0, reinterpret_cast<LPARAM>(pString));
    return 0;
}

LRESULT CMainFrame::OnUser(WPARAM, LPARAM lParam)
{
    CString* pString = reinterpret_cast<CString*>(lParam);
    ASSERT(pString != NULL);
    m_wndStatusBar.SetPaneText(0, *pString);
    delete pString;
    return 0;
}

완벽하지는 않지만 시작입니다.

다른 팁

어쩌면 이것은 당신을 도울 수 있습니다 : MFC의 스레드에서 UI 요소에 액세스하는 방법.

C ++/MFC를 직접 코딩하지는 않지만 크로스 스레드 GUI 업데이트로 알려진 C#에서 유사한 문제를 경험했습니다.

메시지 (Send- 또는 PostMessage와 함께)를 사용하여 상태 표시 줄 텍스트를 업데이트해야한다는 UI 스레드에 알리십시오. 작업자 스레드에서 UI 요소를 업데이트하려고하지 마십시오. 통증을 줄 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top