[MFC] ์์ ์ ์ค๋ ๋ ์์ฑ๊ณผ ํด์ ์ฌ์ฉ ๋ฐฉ๋ฒ (์์ ์ฒจ๋ถ)
์ง๋ ํฌ์คํ
์์ ์์
์ ์ค๋ ๋์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์ค๋ ๋์ ๋ํ ์๊ฐ๋ฅผ ํ์๋๋ฐ์.
2019/08/31 - [MFC] ์์
์ ์ค๋ ๋์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์ค๋ ๋
์ด๋ฒ ํฌ์คํ
์์๋ ์์
์ ์ค๋ ๋์ ๋ํด ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
โป ์์ ์ฝ๋๋ ๋ณธ๋ฌธ ํ๋จ์ ์ฒจ๋ถ๋์ด ์์ต๋๋ค.
MFC์์๋ AfxBeginThread!
๋์๋ MFC Thread์ ๊ดํ ๊ธ๋ค์ ๋ณด๋ฉด ๋ณดํต CreateThread, _beginthread, AfxBeginThread์ ๋ํด ์ค๋ช ํ๋๋ฐ์. ๊ฒฐ๋ก ์ ์ผ๋ก, MFC ๊ด๋ จ ํด๋์ค ๋ฐ API๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ AfxBeginThread๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ๋ณธ๋ฌธ์์๋ ๊ฐ ์ค๋ ๋ ์์ฑ ํจ์์ ๋ํด์๋ ์ค๋ช ์ ์๋ตํ๊ณ , ์ค์ MFC์์ ์ค๋ ๋๋ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง ์๊ฐํ๊ฒ ์ต๋๋ค.
AfxBeginThread ์๊ฐ
API ์ ์: https://docs.microsoft.com/ko-kr/previous-versions/s3w9x78e(v=vs.140)
์์
์ ์ค๋ ๋ ์์ : https://docs.microsoft.com/ko-kr/cpp/parallel/multithreading-creating-worker-threads?view=vs-2019
AfxBeginThread ํจ์์ ์ฃผ์ ์ธ์๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );
CWinThread*
์๋กญ๊ฒ ์์ฑ๋ ์ค๋ ๋ ๊ฐ์ฒด์ ํฌ์ธํฐ๋ฅผ ๋ฐํํฉ๋๋ค. ๋ง์ฝ ์คํจํ๋ฉด NULL์ด ๋ฐํ๋ฉ๋๋ค.
pfnThreadProc:
์์
์ ์ค๋ ๋๊ฐ ํธ์ถ๋ ํจ์ ํฌ์ธํฐ๋ฅผ ์
๋ ฅํฉ๋๋ค. ์ ์ญ ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
pParam:
pfnThreadProc ํจ์๋ก ๋๊ธธ ์ธ์๋ฅผ ์
๋ ฅํฉ๋๋ค.
๊ทธ ์ธ์ ์ต์ ์ ํน๋ณํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ์ค์ ํ์ง ์์ต๋๋ค.
์ค๋ ๋ ์์ฑ๊ณผ ํด์ ํ๊ธฐ
๊ทธ๋ผ ์ด์ ์ด๋ป๊ฒ ์์ฑํ๊ณ ํด์ ํ๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
๋ฐํ๋ฐ์ ์ค๋ ๋ ๊ฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ์ํ CWinThread* ์ธ์คํด์ค์ ์ค๋ ๋ ํจ์ ๋ด์์ ๋ฐ๋ณต ์์ (while๋ฌธ)์ ์ํ ๋ถ์ธ(bool) ๋ณ์๋ฅผ ์ ์ํฉ๋๋ค.
//header file public: CWinThread* m_pThread; bool m_isWorkingThread;
๊ทธ๋ฆฌ๊ณ ์ค๋ ๋ ํจ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํฉ๋๋ค. ๋ฐ๋์ ์ ์ญ ํจ์์ฌ์ผ ํฉ๋๋ค. ์ค๋ ๋ ํจ์๊ฐ ํธ์ถ๋๋ฉด์ ๋ฐ๋ณต์ ์ธ ์์ ์ ์ํด ๋ฃจํ(loop)๊ฐ ํ์ํฉ๋๋ค. ๊ทธ๋์ while๋ฌธ์ ์ฌ์ฉํ์ผ๋ฉฐ ์ถํ ์ข ๋ฃ๋ฅผ ์ํ bool ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
//source file UINT ThreadForCounting(LPVOID param) { CExamWorkerThreadDlg* pMain = (CExamWorkerThreadDlg*)param; while (pMain->m_isWorkingThread) { Sleep(30); //Do something... } return 0; }
์ค๋ ๋ ์์ฑ์ ๋ค์๊ณผ ๊ฐ์ด ํฉ๋๋ค. ์ค๋ ๋ ํจ์๊ฐ ํธ์ถ๋๋ฉด์ ๋ฃจํ๊ฐ ๋์ํ๊ธฐ ์ํด์๋ bool ๋ณ์๋ฅผ ๋ฏธ๋ฆฌ true๋ก ์ค์ ํฉ๋๋ค.
//source file m_isWorkingThread = true; m_pThread = AfxBeginThread(ThreadForCounting, this);
์ค๋ ๋ ํด์ ๋ ๋ค์๊ณผ ๊ฐ์ด ํฉ๋๋ค. bool ๋ณ์๋ฅผ false๋ก ์ค์ ํ๋ฉด ์ค๋ ๋ ํจ์ ๋ด์ ๋ฃจํ๊ฐ ๋๋๊ณ , 0์ ๋ฐํํ๋ฉฐ ์ข ๋ฃ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋๊น์ง ์ค๋ ๋์ ํธ๋ค์ ๊ธฐ๋ค๋ฆฌ๊ธฐ ์ํด WaitForSingleObject๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ํ์์์์ ์์๋ก 5์ด๋ก ์ค์ ํ์ต๋๋ค. ์ฃผ์ํ ์ ์ผ๋ก ํ์์์์ INFINITE๋ก ์ค์ ํ ๊ฒฝ์ฐ, ์ค๋ ๋ ํจ์ ๋ด์ ๋ฃจํ๊ฐ ๋๋์ง ์๊ฒ ๋๋ฉด ํ๋ก๊ทธ๋จ์ด ๋ฉ์ถฐ๋ฒ๋ฆฌ๋ ํ์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
//source file m_isWorkingThread = false; WaitForSingleObject(m_pThread->m_hThread, 5000);
์ด ์ธ์๋ ์ค๋ ๋ ํด์ ๋ฅผ ์ํ ๋ฐฉ๋ฒ์ผ๋ก๋ GetExitCodeThread, TerminateThread, WaitForSingleObject ๋ฑ์ ์ด์ฉํ ๋ฐฉ๋ฒ๋ค์ด ์๋๋ฐ์. ๊ฐ์ ์ ์ธ ์ค๋ ๋ ์ข ๋ฃ๋ ๋ฉ๋ชจ๋ฆฌ ๋ฆญ ๋ฉ์์ง๊ฐ ๋ฐ์ํ์ง๋ ์์ง๋ง, ์์คํ ์์ ๋ฆฌ์์ค๊ฐ ํด์ ๋์ง ์์ ๋ฆฌ์์ค๊ฐ ๋จ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋๋ ํ๋ก๊ทธ๋จ์ ์ ์์ ์ผ๋ก ์ข ๋ฃ๋์ง๋ง ๋ฉ๋ชจ๋ฆฌ ๋ฆญ ๋ฉ์์ง๊ฐ ๋ฐ์ํ๊ธฐ๋ ํฉ๋๋ค. ๊ทธ๋์ ๊ฐ์ฅ ์์ ํ๊ณ ํ์คํ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ค๋ ๋ ํจ์์ ๋ฐ๋ณต ์์ ์ด ํ์คํ๊ฒ ์ข ๋ฃ๋๊ฒ ํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋์ bool ๋ณ์๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํฉ๋๋ค.
์ซ์๋ฅผ ์ฆ๊ฐ์ํค๋ ์ค๋ ๋ ์์
๋ฒํผ์ ๋๋ฅด๋ฉด ์ค๋ ๋ ํจ์๋ฅผ ์์ฑํ๊ณ ์ซ์๋ฅผ 0๋ถํฐ ์นด์ดํ ํ๋ ์์ ๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์๋์ ๊ฐ์ด ๊ฐ๋จํ๊ฒ Static text์ Button์ ๋ฐฐ์นํ์ต๋๋ค.

ํค๋ ํ์ผ์๋ 1์ฉ ์ฆ๊ฐ๋๋ int ๋ณ์์ UpdateCount๋ผ๋ ํจ์๊ฐ ์ ์๋์ด ์์ต๋๋ค. ์ด ํจ์๋ ์ค๋ ๋ ํจ์์์ PostMessage๋ฅผ ๋ฐ๊ฒ ๋์ด UI์ ์ ๊ทผํ๊ฒ ๋ฉ๋๋ค. ์ ์ด๋ ๊ฒ ์ฌ์ฉํ๋์ง ์์ธํ ๋ด์ฉ์ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
[MFC] SendMessage์ PostMessage์ ์ฐจ์ด (์์ ์ฝ๋ ํฌํจ)
//header file #define MESSAGE_INCREASE_COUNT WM_USER public: CWinThread* m_pThread; bool m_isWorkingThread; int m_nCount; LRESULT UpdateCount(WPARAM wParam, LPARAM lParam);
์์ค ํ์ผ์์ Message Map์ ์ ์ํ PostMessage๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ON_MESSAGE๋ฅผ ์ ์ํฉ๋๋ค.
//source file BEGIN_MESSAGE_MAP(CExamWorkerThreadDlg, CDialogEx) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON_THREAD, &CExamWorkerThreadDlg::OnBnClickedButtonThread) ON_MESSAGE(MESSAGE_INCREASE_COUNT, &CExamWorkerThreadDlg::UpdateCount) END_MESSAGE_MAP()
๊ทธ๋ฆฌ๊ณ ์ค๋ ๋ ํจ์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํฉ๋๋ค. PostMessage๋ฅผ ํธ์ถํ๋ฉด ์ UpdateCount ํจ์๊ฐ ํธ์ถ๋ฉ๋๋ค.
//source file UINT ThreadForCounting(LPVOID param) { CExamWorkerThreadDlg* pMain = (CExamWorkerThreadDlg*)param; while (pMain->m_isWorkingThread) { Sleep(30); PostMessage(pMain->m_hWnd, MESSAGE_INCREASE_COUNT, NULL, NULL); } return 0; }
์ซ์๋ฅผ 1์ฉ ์ฆ๊ฐ์ํค๋ UpdateCount ํจ์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ๋์ด ์์ต๋๋ค.
//source file LRESULT CExamWorkerThreadDlg::UpdateCount(WPARAM wParam, LPARAM lParam) { CString text; text.Format(_T("%d"), m_nCount++); SetDlgItemText(IDC_STATIC_COUNT, text); return 0; }
๋ง์ง๋ง์ผ๋ก ์ค๋ ๋ ํจ์๋ฅผ ์์ฑ๊ณผ ํด์ ํ๋ ๋ฒํผ ์ด๋ฒคํธ์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํฉ๋๋ค.
//source file void CExamWorkerThreadDlg::OnBnClickedButtonThread() { CString caption; GetDlgItemText(IDC_BUTTON_THREAD, caption); if (caption == _T("Start")) { m_isWorkingThread = true; m_pThread = AfxBeginThread(ThreadForCounting, this); SetDlgItemText(IDC_BUTTON_THREAD, _T("Stop")); } else { m_isWorkingThread = false; WaitForSingleObject(m_pThread->m_hThread, 5000); SetDlgItemText(IDC_BUTTON_THREAD, _T("Start")); } }
๋๋ฌด๋ ๊ฐ๋จํ์ฃ ? ์์ธํ ์ฝ๋ ๊ตฌํ์ ์๋ ์์ ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
'Programming > MFC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[MFC] Dynamic Layout ์ ์ฉํ์ฌ ์ปจํธ๋กค Resizingํ๊ธฐ(์์ ํฌํจ) (0) | 2020.05.16 |
---|---|
[MFC] Tab Control์ ์ฌ์ฉํ์ง ์๊ณ ์ฌ๋ฌ Form ์ค์์นญํ๊ธฐ(์์ ํฌํจ) (4) | 2019.09.09 |
[MFC] Dialog์ Form(Dialog) ๋ถ์ด๊ธฐ(์์ ํฌํจ) (4) | 2019.09.06 |
[MFC] ์์ ์ ์ค๋ ๋์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์ค๋ ๋ (1) | 2019.08.31 |
[MFC] SendMessage์ PostMessage์ ์ฐจ์ด (์์ ์ฝ๋ ํฌํจ) (2) | 2019.08.26 |
[MFC] lib, dll ํด๋์ ํ์ผ ๋ชฉ๋ก ์ฝ๊ฒ ์ป๋ ๋ฐฉ๋ฒ (0) | 2019.05.25 |
[GDI] ์ด๋ฏธ์ง์ ์์ง์ด๋ ์ง์ ๊ทธ๋ฆฌ๊ธฐ (3) | 2019.03.02 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[MFC] Tab Control์ ์ฌ์ฉํ์ง ์๊ณ ์ฌ๋ฌ Form ์ค์์นญํ๊ธฐ(์์ ํฌํจ)
[MFC] Tab Control์ ์ฌ์ฉํ์ง ์๊ณ ์ฌ๋ฌ Form ์ค์์นญํ๊ธฐ(์์ ํฌํจ)
2019.09.09 -
[MFC] Dialog์ Form(Dialog) ๋ถ์ด๊ธฐ(์์ ํฌํจ)
[MFC] Dialog์ Form(Dialog) ๋ถ์ด๊ธฐ(์์ ํฌํจ)
2019.09.06 -
[MFC] ์์ ์ ์ค๋ ๋์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์ค๋ ๋
[MFC] ์์ ์ ์ค๋ ๋์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์ค๋ ๋
2019.08.31 -
[MFC] SendMessage์ PostMessage์ ์ฐจ์ด (์์ ์ฝ๋ ํฌํจ)
[MFC] SendMessage์ PostMessage์ ์ฐจ์ด (์์ ์ฝ๋ ํฌํจ)
2019.08.26
๋๊ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.