MFC의 스레드에서 상태 표시 줄의 창 텍스트를 변경하는 방법은 무엇입니까?
-
23-08-2019 - |
문제
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 요소를 업데이트하려고하지 마십시오. 통증을 줄 수 있습니다.
제휴하지 않습니다 StackOverflow