취미생활/프로그래밍

C++/MFC 활용 팁: 서버·소켓·모달리스·쓰레드·메뉴·타이밍 정리

내가그리는인생 2025. 7. 9. 12:35
반응형

MFC 기반 서버 소켓부터 모달리스 다이얼로그, 쓰레드 코드, 성능 타이밍, 메뉴 처리 정리!

1. MFC 서버 초기화 & 소켓 기반 통신

핵심 클래스: CSocket, CArchive

예제 코드:

void CServerSocket::OnAccept(int nErrorCode) {
    CDataSocket* pClient = new CDataSocket;
    Accept(*pClient);
    AfxGetMainWnd()->PostMessage(WM_USER_ACCEPT, (WPARAM)pClient, 0);
    CSocket::OnAccept(nErrorCode);
}

: CArchiveSerialize 기반 직렬화 송수신 구현 시 안정적입니다.


2. 범용 서버/데이터 소켓 구조

핵심 설계: UM_ACCEPT 메시지를 통한 이벤트 처리, Serialize 메서드 구현

예제 코드:

void CMyData::Serialize(CArchive& ar) {
    if (ar.IsStoring()) {
        ar << m_strData;
    } else {
        ar >> m_strData;
    }
}

: 데이터 처리 클래스를 CObject 상속하여 Serialize 인터페이스 구현


3. 모달리스 대화상자에서 View 자동 업데이트

핵심 동작: 다이얼로그 → View 포인터 참조 → Invalidate() 호출

예제 코드:

void CInputDlg::OnBnClickedApply() {
    UpdateData(TRUE);
    m_pView->Invalidate();
}

: 생성 시 m_pView는 다이얼로그의 생성자에서 전달받아 초기화


SMALL

4. 쓰레드 예제 – MFC & WinAPI 연동

핵심 API: AfxBeginThread, WaitForSingleObject

예제 코드:

UINT ThreadFunc(LPVOID pParam) {
    for (int i = 0; i < 1000000; ++i) {}
    return 0;
}

void CMainFrame::StartMyThread() {
    CWinThread* pThread = AfxBeginThread(ThreadFunc, NULL);
}

: 쓰레드 내부에서 UI 접근 시 PostMessage() 사용 권장


5. MFC 윈도우 핸들 가져오기 (AfxGetApp)

핵심 개념: AfxGetApp()->m_pMainWnd, GetActiveView()

예제 코드:

CWnd* pMainWnd = AfxGetApp()->m_pMainWnd;
CView* pView = ((CFrameWnd*)pMainWnd)->GetActiveView();

: 특정 뷰의 컨트롤 접근이나 메시지 전달에 활용 가능


6. 고정밀 시간 측정 – QueryPerformanceCounter

핵심 함수: QueryPerformanceFrequency, QueryPerformanceCounter

예제 코드:

LARGE_INTEGER freq, start, end;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&start);

// 타이밍 측정 대상 코드
Sleep(500);

QueryPerformanceCounter(&end);
double duration = (double)(end.QuadPart - start.QuadPart) / freq.QuadPart;

: 타이밍 로그 기록용 유틸 클래스로 래핑해 사용하면 재사용성 높음


7. MFC 메뉴 메시지 처리 정리

핵심 매크로: ON_COMMAND, ON_COMMAND_RANGE, ON_UPDATE_COMMAND_UI

예제 코드:

BEGIN_MESSAGE_MAP(CMyView, CView)
    ON_COMMAND_RANGE(ID_MENU_ITEM1, ID_MENU_ITEM5, OnMenuRange)
END_MESSAGE_MAP()

void CMyView::OnMenuRange(UINT nID) {
    AfxMessageBox(_T("선택된 메뉴: ") + std::to_wstring(nID).c_str());
}

: 그룹 단위 메뉴 처리 시 유지보수 및 확장성 우수

 

반응형