[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