C++다 중 스 레 드 프로 그래 밍(3)스 레 드 간 통신

다 중 스 레 드 프로 그래 밍 의 3-스 레 드 간 통신 작성 자:한 요 욱
원본 주소:http://www.vckbase.com/document/viewdoc/?id=1707
 
7.스 레 드 간 통신
일반적으로 응용 프로그램의 부차적인 라인 은 항상 주 라인 에서 특정한 임 무 를 수행한다.그러면 주 라인 과 부차적인 라인 사이 에는 반드시 정보 전달 의 채널,즉 주 라인 과 부차적인 라인 간 에 통신 을 해 야 한다.이러한 스 레 드 간 의 통신 은 피 할 수 없 을 뿐만 아니 라 다 중 스 레 드 프로 그래 밍 에서 도 복잡 하고 빈번 하 므 로 다음 에 설명 할 것 이다.
  • 전체 변 수 를 사용 하여 통신 을 합 니 다.같은 프로 세 스에 속 하 는 각 스 레 드 공유 운영 체제 가 이 프로 세 스 의 자원 을 분배 하기 때문에 스 레 드 간 통신 을 해결 하 는 가장 간단 한 방법 은 전체 변 수 를 사용 하 는 것 입 니 다.표준 형식의 전역 변수 에 대해 서 는 volatile 수식 자 를 사용 하 는 것 을 권장 합 니 다.컴 파일 러 는 이 변 수 를 최적화 할 필요 가 없다 는 것 을 알려 줍 니 다.즉,레지스터 에 넣 지 않 아 도 되 고 이 값 은 외부 에서 변 경 될 수 있 습 니 다.만약 에 스 레 드 간 에 전달 해 야 할 정보 가 비교적 복잡 하 다 면 우 리 는 구 조 를 정의 하고 이 구 조 를 가리 키 는 지침 을 전달 하여 정 보 를 전달 할 수 있다. 
  • 사용자 정의 메 시 지 를 사용 하면 한 스 레 드 의 실행 함수 에서 다른 스 레 드 에 사용자 정의 메 시 지 를 보 내 통신 의 목적 을 달성 할 수 있 습 니 다.하나의 스 레 드 가 다른 스 레 드 에 메 시 지 를 보 내 는 것 은 운영 체제 로 이 루어 진 것 이다.윈도 우즈 운영 체제 의 메시지 구동 메커니즘 을 이용 하여 한 라인 이 메 시 지 를 보 낼 때 운영 체 제 는 먼저 이 메 시 지 를 받 은 다음 에 이 메 시 지 를 목표 라인 에 전달 하고 메 시 지 를 받 는 라인 은 반드시 메시지 순환 을 구축 해 야 한다.

  • 루틴 7 MultiThread 7
    이 규칙 은 사용자 정의 메 시 지 를 사용 하여 스 레 드 간 통신 을 하 는 방법 을 보 여 준다.우선,메 인 코스 는 CCalculate Thread 스 레 드 에 메 시 지 를 보 냅 니 다 WMCALCULATE,CCalculate Thread 스 레 드 가 메 시 지 를 받 은 후 계산 하여 메 인 스 레 드 에 WM 를 보 냅 니 다.DISPLAY 메시지,메 인 스 레 드 가 이 메 시 지 를 받 은 후 계산 결 과 를 표시 합 니 다.
  • 대화 상자 기반 프로젝트 MultiThread 7 을 만 들 고 대화 상자 IDDMULTITHREAD7_DIALOG 에 체크 버튼 3 개 추가 IDCRADIO1,IDC_RADIO2,IDC_RADIO 3,제목 은 각각 1+2+3+4+...+10,1+2+3+4+...+50,1+2+3+4+...+100.가입 버튼 IDCSUM,제목 은'구 화'입 니 다.태그 상자 추가 IDC상태,속성 선택"테두리";
  • MultiThread7Dlg.h 에서 다음 과 같은 변 수 를 정의 합 니 다.
    protected:
    	int nAddend;
    
    은 가수의 크기 를 대표 합 니 다.각각 세 개의 체크 단 추 를 더 블 클릭 하고 메시지 응답 함 수 를 추가 합 니 다.
    void CMultiThread7Dlg::OnRadio1() 
    {
    	nAddend=10;
    }
    
    void CMultiThread7Dlg::OnRadio2() 
    {
    	nAddend=50;
    	
    }
    
    void CMultiThread7Dlg::OnRadio3() 
    {
    	nAddend=100;
    	
    }
       OnInitDialog             : 
    BOOL CMultiThread7Dlg::OnInitDialog()
    {
    ……
    	((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);
    	nAddend=10;
    ……
     
    MultiThread7Dlg.h 에 추가 합 니 다.
    #include "CalculateThread.h"
    #define WM_DISPLAY WM_USER+2
    class CMultiThread7Dlg : public CDialog
    {
    // Construction
    public:
    	CMultiThread7Dlg(CWnd* pParent = NULL);	// standard constructor
    	CCalculateThread* m_pCalculateThread;
    ……
    protected:
    	int nAddend;
    	LRESULT OnDisplay(WPARAM wParam,LPARAM lParam);
    ……
    
     MultiThread7Dlg.cpp   : 
    BEGIN_MESSAGE_MAP(CMultiThread7Dlg, CDialog)
    ……
    	ON_MESSAGE(WM_DISPLAY,OnDisplay)
    END_MESSAGE_MAP()
    
    LRESULT CMultiThread7Dlg::OnDisplay(WPARAM wParam,LPARAM lParam)
    {
    	int nTemp=(int)wParam;
    	SetDlgItemInt(IDC_STATUS,nTemp,FALSE);
    
      return 0;
    
    }
     
    이상 코드 를 사용 하면 메 인 라인 클래스 CMulti Thread7Dlg 가 WM 를 처리 할 수 있 습 니 다.DISPLAY 소식,즉 IDCSTATUS 탭 상자 에 계산 결 과 를 표시 합 니 다.
  • 더 블 클릭 버튼 IDCSUM,메시지 응답 함수 추가:
    void CMultiThread7Dlg::OnSum() 
    {
    	m_pCalculateThread=
    		(CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
    
    	Sleep(500);
    
    	m_pCalculateThread->PostThreadMessage(WM_CALCULATE,nAddend,NULL);
    }
     OnSum()        CalculateThread  ,        WM_CALCULATE  。 
  • 프로젝트 를 우 클릭 하고"New Class..."를 선택 하면 프로젝트 에 기본 클래스 를 CWinThread 파생 스 레 드 클래스 CCalculateThread 로 추가 합 니 다.파일 Calculate Thread.h 에
    #define WM_CALCULATE WM_USER+1 
    class CCalculateThread : public CWinThread
    {
    ……
    protected:
    	afx_msg LONG OnCalculate(UINT wParam,LONG lParam);
    ……
    
       CalculateThread.cpp    
    LONG CCalculateThread::OnCalculate(UINT wParam,LONG lParam)
    {
    	int nTmpt=0;
    	for(int i=0;i<=(int)wParam;i++)
    	{
    		nTmpt=nTmpt+i;
    	}
    
    	Sleep(500);
        ::PostMessage((HWND)(GetMainWnd()->GetSafeHwnd()),WM_DISPLAY,nTmpt,NULL);
    
    	return 0;
    }
    BEGIN_MESSAGE_MAP(CCalculateThread, CWinThread)
    	//{{AFX_MSG_MAP(CCalculateThread)
    		// NOTE - the ClassWizard will add and remove mapping macros here.
    	//}}AFX_MSG_MAP
    	ON_THREAD_MESSAGE(WM_CALCULATE,OnCalculate)
    //      ,       
    END_MESSAGE_MAP()
    
     
    Calculate Thread.cpp 파일 의 시작 부분 에 하 나 를 추가 합 니 다:
    #include "MultiThread7Dlg.h"
    
    이상 의 코드 는 CCalculate Thread 클래스 에 WM 를 추 가 했 습 니 다.CALCULATE 메시지,메시지 의 응답 함 수 는 OnCalculate 입 니 다.그 기능 은 매개 변수 wParam 의 값 에 따라 누적 되 고 누적 결 과 는 임시 변수 nTmpt 에서 0.5 초 지연 되 며 메 인 스 레 드 에 WM 을 보 내 는 것 입 니 다.DISPLAY 메 시 지 를 표시 합 니 다.nTmpt 는 매개 변수 로 전 달 됩 니 다.

  • 이 규칙 을 컴 파일 하고 실행 하여 온라인 으로 메 시 지 를 전달 하 는 방법 을 체험 합 니 다.
    (미 완성 계속)

    좋은 웹페이지 즐겨찾기