티스토리 뷰

MFC 스레드2

작업자 스레드

- 스레드 내에서 View 에 그리는 방법 25, 26행

- 스레드에 우선 순위 레벨 지정 방법 75, 76행
스레드 생성과 동시에 우선순위 레벨 지정하려면 68행에서 지정해주고, CREATE_SUSPENDED 대신 0 을 넣는다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
struct ThreadArg
{
    HWND hWnd; // 윈도우 핸들
    int type; // 1이면 위쪽, 2이면 아래 막대를 그린다.
};
 
class CMFCApplication6View : public CView
{
...
public:
    afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
    CWinThread* m_pThread1, *m_pThread2;
    ThreadArg m_arg1, m_arg2;
};
 
BEGIN_MESSAGE_MAP(CMFCApplication6View, CView)
...
    ON_WM_LBUTTONDBLCLK()
END_MESSAGE_MAP()
 
UINT MyDraw(LPVOID arg)
{
    ThreadArg* pArg = (ThreadArg*)arg;
    CDC dc;
    HDC hdc = ::GetDC(pArg->hWnd); // View의 핸들로 View의 DC의 핸들을 얻는다.
    dc.Attach(hdc); // DC에 View의 DC핸들을 연결시켜 View 에 그리게 된다.
    int i, x, y, inc;
    CBrush brush1(RGB(25500));
    CBrush brush2(RGB(00255));
    switch (pArg->type)
    {
    case 1// 위쪽에 사각형 그림
        dc.SelectObject(&brush1);
        x = 100, y = 100;
        for (i = 0; i < 100000; i++)
        {
            inc = i / 200;
            dc.Rectangle(x, y, x + inc, y + 20);
        }
        break;
    case 2// 아래 쪽에 사각형 그림
        dc.SelectObject(&brush2);
        x = 100, y = 200;
        for (i = 0; i < 100000; i++)
        {
            inc = i / 200;
            dc.Rectangle(x, y, x + inc, y + 20);
        }
        break;
    }
    dc.Detach(); // DC 핸들 연결 끊기
    ::ReleaseDC(pArg->hWnd, hdc);
    return 0;
}
 
void CMFCApplication6View::OnLButtonDblClk(UINT nFlags, CPoint point)
{
    // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
    CClientDC dc(this);
    dc.SelectStockObject(WHITE_PEN);
    dc.SelectStockObject(WHITE_BRUSH);
    CRect rect;
    GetClientRect(&rect);
    dc.Rectangle(&rect); // 윈도우 배경을 색칠한다.
 
    m_arg1.hWnd = this->m_hWnd; // 스레드 내에서 View에 그릴 수 없어 View 핸들을 스레드에 전달한다.
    m_arg1.type = 1;
    m_pThread1 = AfxBeginThread(MyDraw, &m_arg1, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
    // CREATE_SUSPENDED 로 지정하면 스레드가 바로 실행되지 않고 ResumeThread() 호출 해줘야 시작된다. 0 이면 바로 시작.
 
    m_arg2.hWnd = this->m_hWnd;
    m_arg2.type = 2;
    m_pThread2 = AfxBeginThread(MyDraw, &m_arg2, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
 
    m_pThread1->SetThreadPriority(THREAD_PRIORITY_IDLE); // 느리게 지정
    m_pThread2->SetThreadPriority(THREAD_PRIORITY_HIGHEST); // 빠르게 지정
 
    m_pThread1->ResumeThread(); // 스레드 재시작
    m_pThread2->ResumeThread();
 
    CView::OnLButtonDblClk(nFlags, point);
}
cs

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31