minjeong-oh
기록
minjeong-oh
전체 방문자
오늘
어제
  • 분류 전체보기 (207)
    • ML & Neural Net (3)
    • ◼️GNN (1)
    • ◼️시계열 (1)
    • ◼️추천시스템 (0)
    • ◼️수학 (3)
    • Data Engineer (2)
    • ◼️Spark (1)
    • ◼️Kafka (1)
    • ◼️Elestic Search (0)
    • ◼️Redis (0)
    • ◼️ClickHouse (1)
    • Programming Language (4)
    • ◼️React (0)
    • ◼️Git (1)
    • ◼️Python (1)
    • ◼️C++ (33)
    • ◼️Fortran 99 (2)
    • ◼️OpenGL (7)
    • ◼️MFC (35)
    • ◼️Flutter (46)
    • ◼️Kotlin (1)
    • ◼️Android (1)
    • ◼️Java (1)
    • ◼️C (4)
    • Development (0)
    • ◼️디자인패턴 (0)
    • ◼️네트워크 (2)
    • ◼️인증 (1)
    • Computer Science (4)
    • 알고리즘 문제풀이 (12)
    • SQL 고득점 Kit 문제풀이 (8)
    • 취업준비 (0)
    • Notion 정리 글 (1)
    • Article Scrap (12)
      • Careerly - Q&A (7)
      • Careerly - Post (2)
    • 기타 등등 (16)

블로그 메뉴

  • 글쓰기
  • 홈
  • 태그
  • 방명록
  • 편집

공지사항

인기 글

태그

  • OpenGL회전
  • NextJSSwagger
  • AI배워야하나
  • API문서정리
  • kafka구축
  • 구조체매개변수
  • 인공지능개발자
  • hello테마
  • 그램풀스팩업그레이드
  • 이차원구조체배열포인터
  • 리눅스파티션
  • 이것이C++이다책참고
  • 그램업그레이드
  • mfc
  • 티스토리폰트배경색없애기
  • 19년식그램SSD장착
  • 19년식그램램장착
  • GSLB
  • 구조체배열포인터
  • SpringBootSwagger

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
minjeong-oh

기록

◼️MFC

[MFC] 스레드에서 메인스레드 ui 접근해서 상태 변경

2023. 1. 12. 12:15

Issue

 MFC에서 스레드를 생성하고 CMainFrame에 Docking해둔 CDialogBar 내의 CSliderCtrl과 CEdit의 상태를 변경하고자 한다.

 

Solution

생성한 스레드에서는 메인스레드에 있는 ui에 바로 접근하지 못한다.
따라서 thread를 생성할 때 접근하고자 하는 컨트롤 윈도우의 핸들값을 넘겨줘야한다. (이때 주소값을 넘겨주면 안된다. 핸들과 주소값 은 다른 것임!) 그 후 thread에서 handle값을 받아서 윈도우함수(?)를  사용해서 값을 변경하도록한다. (::SendMessage, ::SetTextWindowA)  
 
(그외에 thread외부에 생성된 변수를 사용할때는 thread를 시작할때 주소값을 넘겨주면 된다. 넘길수있는 인자는 하나이기 때문에 넘길값이 여러개면 구조체를 만들어서 여러가지 값을 묶어서 구조체 하나만 넘기면된다.)

 
 

1. 핸들을 얻어오는 방법 GetSafeHwnd()
2. 핸들 값을 이용해 스레드에서 메인스레드 접근. CSliderCtrl 범위 설정하고 slider에 현재 값 설정. CEdit값 설정

 

1. 핸들을 얻어오는 방법

 사용자 정의 스레드에서 메인 스레드의 ui를 접근하기 위해서는 해당 컨트롤 윈도우의  핸들값을 전달하여 핸들값으로 접근해야햔다. * 주소값이 아니라 핸들로 다뤄야 접근 가능하다.*

HWND hwnd = eidt->GetSafeHwnd();  //핸들 얻는 방법

 

2. 핸들 값을 이용해 스레드에서 메인스레드 접근.

 CSliderCtrl 범위 설정하고 현재 값 설정하기. CEdit 값 설정하기

////////////*MainDialog.h*////////////
typedef struct MainThreadStruct{
	HWND slider;
    HWND edit;
}MainThreadStruct;
MainThreadStruct mainUI;

///////////*MainDialog.cpp*////////////
void MainDialog::executeThread(){
    
    CMainFrame * pFrame = (CMainFrame*)AfxGetMainWnd();
    mainUI.slider = ((CButton*)pFrame->m_wndDisControl.GetDlgItem(IDC_MAIN_SLIDER))->GetSafeHwnd();
    mainUI.edit = ((CEdit*)pFrame->m_wndDisControl.GetDlgItem(IDC_MAIN_EDIT))->GetSafeHwnd();
	
	CWinThread * pThread = AfxBeginThread(ThreadFunction, &mainUI);  //스레드 실행
}

UNIT MainDialog::ThreadFunction(LPVOID pParam){
	MainThreadStruct * mainUI = (MainThreadStruct*) pParam;
    
	HWND sliderHwnd = mainUI->slider;
	HWND editHwnd = mainUI->edit;
    
    /*slider 범위 설정*/
    ::SendMessage(sliderHwnd, TBM_SETRANGE,
            (WPARAM)TRUE,                   // redraw flag 
            (LPARAM)MAKELONG(1, 5));  // min. & max. position

    /*slider 값 설정*/
    ::SendMessage(slider, TBM_SETPOS,
                (WPARAM)TRUE,       // redraw flag 
                (LPARAM)panoramaSet.cur);

    /*CEdit 값 설정*/
    ::SetWindowTextA(editHwnd, str);
    
    pThread=NULL;  //스레드 종료
    return 0;
}

 

Review

 핸들이랑 주소값이랑 헷갈려서 핸들쓰는 곳에 주소값을 넣는건 줄 알았는데 이번 기회에 handle을 얻는법을 제대로 알았다. GetSafeHwnd()
구글링 이리저리 하면서 하나의 게시물에서 답을 바로 찾은게 아니라 게시글마다 조금씩 정보를 찾아나갔다. 완전히 해결된 후에 reference를 적으려고하니 이미 닫은 페이지라 찾기 힘든 페이지들이 있었다. 다행히 크롬이 이전에 닫은 페이지 기록해줘서 다 기록할 수있긴 했지만 조금이라도 도움받은 것 같은 게시글은 꼭 북마크해두는 습관을 갖자! 
 

 

[Reference]

 
핸들에 대한 설명
https://blog.naver.com/tipsware/221065382244
 
thread에서 SetWindowText, SendMessage 호출해서 사용하면 된다는 내용.
https://stackoverflow.com/questions/48379003/mfc-is-it-safe-to-call-cwnd-methods-from-another-thread 
 
SendMessage 로 CSliderCtrl에 이벤트 메시지 보내는 방법
https://learn.microsoft.com/ko-kr/windows/win32/controls/process-trackbar-notification-messages
 
 

'◼️MFC' 카테고리의 다른 글

[MFC] 다이얼로그와 클래스 연결  (0) 2023.02.16
[MFC] CSliderCtrl 을 Edit창에있는 값으로 SetPos하면 이전 위치의 흔적이 남는문제  (0) 2023.01.13
[MFC] 리소스 뷰에서 컴포넌트 최상단에 위치시키기  (0) 2023.01.02
[MFC] 다이얼로그 모달 방식 malloc 불가?  (0) 2022.10.11
[MFC] CListCtrl 팁  (0) 2022.10.10

    티스토리툴바