티스토리 뷰

C,C++

MFC : 쓰레드(Thread) 정리와 예제 2

Andrew Shin 2015. 6. 16. 21:15

MFC 쓰레드(Thread) 정리와 예제


이번에는 MFC에서의 쓰레드(Thread)에 대해서 정리해 보겠다.


<View.h>

1
2
public:
    int m_offset = 0;
cs


<View.c>

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
struct PARAM
{
    CRect m_rc;
    COLORREF m_color;
    CMy06_16_TESTView* m_view;
 
    PARAM(CRect rc, COLORREF color, 
    CMy06_16_TESTView* view)
        :m_rc(rc), m_color(color), m_view(view) {}
};
 
UINT FrameProc(void* p)
{
    PARAM param = *(PARAM*)p;
    CClientDC dc(param.m_view);
 
    int delay = 10;
 
    for (int i = param.m_rc.left; i < param.m_rc.right; i++)
    {
        SetPixel(dc, i, param.m_rc.top, param.m_color);
        Sleep(delay);
    }
    for (int i = param.m_rc.top; i < param.m_rc.bottom; i++)
    {
        SetPixel(dc, param.m_rc.right, i, param.m_color);
        Sleep(delay);
    }
    for (int i = param.m_rc.right; i > param.m_rc.left; i--)
    {
        SetPixel(dc, i, param.m_rc.bottom, param.m_color);
        Sleep(delay);
    }
    for (int i = param.m_rc.bottom; i > param.m_rc.top; i--)
    {
        SetPixel(dc, param.m_rc.left, i, param.m_color);
        Sleep(delay);
    }
 
    return 0;
}
 
void CMy06_16_TESTView::OnLButtonDown(UINT nFlags, CPoint point)
{
    CRect rc;
    GetClientRect(&rc);
 
    rc.InflateRect(-m_offset, -m_offset);
 
    AfxBeginThread(FrameProc, new PARAM(rc, 
    RGB(rand() % 256, rand() % 256, rand() % 256), this));
 
    m_offset++;
 
    CView::OnLButtonDown(nFlags, point);
}
cs


예제2. 코드분석

C에서 훑어본 예제보다 코드의 양이 다소 길어졌다.


우선 MFC에서의 쓰레드는 AfxBeginThread 라는 함수로 사용할 수 있다.

전달인자로는 함수와 매개변수가 있다. C에서의 스택 사이즈가 빠졌다고 할 수 있다.


예제의 출력 결과이다.



왼쪽클릭을 할때마다 스레드가 하나씩 생성이되고, 테두리를 따라서 SetPixel 함수로 색깔을 채워입히는 식이다. 클릭을 할때마다 테두리가 안쪽으로 한칸씩 줄어든다.


이 전 게시글 C언어 쓰레드 정리와 예제 1 (http://andrew0409.tistory.com/91)에서 스레드에 매개변수를 여러개 전달하려면 구조체를 사용해서 전달하라고 했는데, 마침 이번 예제에서는 PARAM 이라는 구조체에 생성자를 통해서 새로운 구조체를 매번 만들어서 전달하는 방식을 사용했으니 참고 바란다.


세줄요약.

MFC에서의 스레드는 AfxBeginThread(ThreadProc, new PARAM()); 과 같은 식으로 사용할 수 있다.

첫번째 매개변수는 사용할 함수, 두번째 매개변수는 전달인자로 보낼것들 물론 지난번 게시글에서 언급했듯이 하나의 변수를 전달하려면 구조체를 사용하지 않아도 좋다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함