MFC는 여러 스레드가 AfxBeginThread에서 MFC 스레드의 사용을 기반으로 비 모달 대화 상자가 아닌 모달 대화 확립 만들 수있는 하위 스레드의 창 (PostMessage를 방법)을 생성

1, 자식 스레드를 만들

C ++ 스레드를 만들 수있는 더 많은 방법입니다

1) 쉬운 - 사용 <실> 헤더 파일,하지만 메인 스레드에 PostMessage를 메시지를 수없는이 방법에 의해 생성 된 자식 스레드 (I)는 짧은에 성공하지 못했습니다, 실수를했을 수 있습니다

세 가지 방법 2) 3) 4)를 참조 VC 스레드 생성 https://blog.csdn.net/u014568921/article/details/44262645

3 MFC 같은 사육 프로그램 외모에 4 내가 AfxBeginThread에서 여러 가지 시도를 보냈다 작동하지 않습니다 () 메소드는 성공

무효 CMFCDLLTestDlg :: OnBnClickedMessage () 
{ 
    // 해야할 일이 또한 컨트롤 알림 처리기 코드에서
     // 시작 스레드가 웹 소켓 
    AfxBeginThread ((AFX_THREADPROC) MsgThread, (VOID *) 은이 , THREAD_PRIORITY_NORMAL, 0 , 0 , NULL을); 
}

여기에 내가 버튼을 클릭 이벤트에 있었다가 스레드 웹 소켓을 시작, 글로벌 스레드 함수 MsgThread ()

2, 창을 통해 사용자 정의 메시지를 만들

MFC 프로그램에서 호출 직접 자식 스레드가 생성 () 메소드는 하위 스레드의 생성 과정과 같은 사이클 외모를 차단, 비 모달 창을 만들 수 없습니다, 방법을 만들기 위해 메인 스레드를 통지하는 사용자 정의 메시지를 사용하는 것이 필요하다

2.1 사용자 정의 메시지

MFC 사용자 정의 메시지는 세 단계로하지 어렵다

도 1을 참조하면, 메시지 ID를 정의

내 프로그램은 이렇게 정의 MFCDLLTestDlg.cpp 메시지 ID에 MFCDLLTestDlg라고

#DEFINE TEST_SENDMSG 200 + WM_USER이다 // 메시지 ID에

(2) 메시지 핸들러의 정의

메시지 처리 기능 수신 핸들 사용자 정의 메시지에 사용됩니다 , 이것은 또한 OK, 클래스 마법사 사용자 지정 메시지 처리 또는 자신의 필기 추가 할 수있는 두 가지 방법이 있습니다 세 번째 저장 클래스 마법사를 사용하여 직접 바인딩 할 수는 단계

클래스 마법사 모드 : 클래스에 스위치를 시도 ---> --- 클래스 마법사> 메시지 ---> 사용자 정의 메시지를 추가 한 다음 사용자 정의 입력 메시지 ID 함수 이름의 같은과를

 클래스 필기로 마법사와는, 어쨌든, 자신의 메시지 ID가 정의되어야합니다, 고정 된 수의 WM_USER +는 라인에 반복되지 않을 것이다

그런 다음 헤더 파일은 주 대화 클래스로 작성된 메시지 핸들러 노트를 선언

AFX_MSG LRESULT OnTestSendmsg (WPARAM의 wParam, LPARAM lParam에);

그런 다음 CPP를 정의

LRESULT CMFCDLLTestDlg :: OnTestSendmsg (WPARAM의 wParam, LPARAM의 lParam) 
{ 
    스위치 (의 wParam) 
    { 
    케이스 TEST_SENDMSG : 
        CMsgWindow * = p_MsgWindow 새로운 CMsgWindow (); 
        p_MsgWindow -> SetSkin (MAKEINTRESOURCE (IDB_BITMAP1));
        // p_MsgWindow-> SetSkin (MAKEINTRESOURCE (IDB_BITMAP2));
        // p_MsgWindow-> SetSkin (MAKEINTRESOURCE (IDB_BITMAP3)); 

        CString을 *는 cmsg = (CString을 * )를 lParam 단계; 

        만약 (! p_MsgWindow-> 만들기 (m_hWnd, _T ( " 通知" ))) 
        { 
            AfxMessageBox (L "! 다음은 실패 만들기 " ); 반환을 - . 1 ; 
        } 
        p_MsgWindow -> SetMsg (L " 모조 QQ 오른쪽 아래 뉴스 팝 " ,는 cmsg *, L " http://blog.csdn.net/jackystudio " ); 
        p_MsgWindow -> () 표시,
         BREAK를 ; 
    } 

    반환 LRESULT를 (); 
}

여기에 내가이 여행에 대한 관심이 메시지 창,받은 후 한 폭탄이었다  http://blog.csdn.net/jackystudio의  블로그를, 여기 아름다운 팝 프로그램을 찾을 수

두 파라미터의 함수 참고 [WPARAM wparam에, LPARAM lParam에]가 , 이것이 그 유형으로 변환 될 수는 첫 번째 파라미터는 메시지 타입은 두번째 파라미터 문자열, 정수, 및 다른 파라미터이며,이되도록 사용될 수있다 여기에 문자열 CString을이다

이 두 가지 매개 변수를 PostMessage 함수에 전달되는, 아래 참조

3, 메시지 처리기 매핑을 추가

으로 메시지 ID 및 처리 기능 뿐만 아니라, 두 가지가 연관 되는, 메시지 맵은 또한 주요 카테고리로 동작 발견 MESSAGE_MAP을

BEGIN_MESSAGE_MAP (CMFCDLLTestDlg, CDialogEx) 
    ON_WM_SYSCOMMAND () 
    ON_WM_PAINT () 
    ON_WM_QUERYDRAGICON () 
    ON_BN_CLICKED (IDC_WIN_TEXT,CMFCDLLTestDlg :: OnBnClickedWinText) 
    ON_BN_CLICKED (IDC_NEW_DLG,CMFCDLLTestDlg :: OnBnClickedNewDlg) 
    ON_BN_CLICKED (IDC_MESSAGE,CMFCDLLTestDlg :: OnBnClickedMessage) ON_MESSAGE (TEST_SENDMSG,

    CMFCDLLTestDlg :: OnTestSendmsg) 
END_MESSAGE_MAP ()

당신은 시스템 메시지 및 매핑 버튼을 클릭 이벤트가 모습 메시지 맵의 기본 클래스입니다, 여기에 참고입니다 볼 수 있습니다  BEGIN_MESSAGE_MAP (CMFCDLLTestDlg, CDialogEx)이 , 내가 먼저 클래스에 대해 내부에 썼다

2.2 메시지 보내기

보조 실 함수 를 PostMessage는 메시지 전송이 일반적으로 사용된다 및 SendMessage의 A는 비동기 동기화 라인

// 생략 다른 논리 스레드 함수
 // ...
 // 메시지 보내기 
:: PostMessage를 (AfxGetMainWnd () -> GetSafeHwnd () TEST_SENDMSG (WPARAM) TEST_SENDMSG (LPARAM)는 cmsg);

이 추가 기능을 PostMessage를 알아야한다 범위 규정 그렇지 않으면 함수 호출 여러 가지 방법이있다,

첫 번째 파라미터는 메인 윈도우에 대한 핸들 인, 두 번째 파라미터는 메시지 ID, 세 번째, 네 매개 변수 인 상기 메시지 핸들러에 대응하는 2 개 개의 파라미터

실행시 메시지 기능을 보내는 그리고, 메인 쓰레드는 메시지 창, 윈도우 함수를 만드는 과정을 받게됩니다

물론, 한 변화에 대한 메시지 ID 및 매개 변수로, 예를 들어, 버튼 클릭 이벤트 ID 또는 메시지 ID 시스템으로 대체, 당신은 다른 일을 할 수있다  

도 3을 참조 기사

AfxBeginThread는에 C ++ Part8 MFC를 (코드 예제)를 사용하는

AfxBeginThread에서 MFC를 사용하여 다중 스레드를 생성

비 모달 대화 스레드의 설립과 비 모달 대화의 설립

MFC sendMessage 첨부 () 함수는 문자열을 전달

추천

출처www.cnblogs.com/jixiaohua/p/12117147.html