mfc_ThreadMutex - 8BitsCoding/RobotMentor GitHub Wiki

Multithread์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์กด์žฌ

  1. Worker thread
  2. User Interface thread

Workerthread

Workerthread๋ž€ ๊ฒฐ๊ตญ AfxBeginThread๋ฅผ ์ด์šฉํ•œ๋‹ค.


์‚ฌ์šฉ

CWinThread *pThread = ::AfxBeginThread(ThreadFunc, &pParams);
// ThreadFunc : ์Šค๋ ˆ๋“œ๊ฐ€ ๋Œ์•„๊ฐˆ ํ•จ์ˆ˜
// pParams : ThreadFunc์˜ ๋งค๊ฐœ๋ณ€์ˆ˜

AfxBeginThread์˜ ์ƒ์„ฑ์ž

CWinThread* ::AfxBeginThread(
       AFX_THREADPROC pfnThreadProc,
       LPVOID pParam,
       int nPriority = THREAD_PRIORITY_NORMAL, // ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฃผ Process์™€ ๋™์ผ
       UINT nStackSize = 0,
       DWORD dwCreateFlags = 0,                      // 0 ๋˜๋Š” CREATE_SUSPENDED
       LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);

Thread ํ•จ์ˆ˜ ์„ ์–ธ

// static์ด ์„ ์–ธ๋˜์–ด ์žˆ์–ด์•ผํ•จ์„ ๊ธฐ์–ต
static UINT ThreadFunc(LPVOID pParam)
{
       int option = (int)pParam;
       โ€ฆ
}

Thread ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ ์–ธ

// ๋งŒ์•ฝ ์ธ์ž๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ์—๋Š”
 
typedef struct tagPARAMS
{
       ...
} PARAMS;
 
// ์™€ ๊ฐ™์ด ํ•œ ํ›„์—
 
PARAMS *pParams = new PARAMS;
CWinThread *pThread = ::AfxBeginThread(ThreadFunc, &pParams);
static UINT ThreadFunc(LPVOID pParam)
{
       PARAMS *pThreadParams = (PARAMS *)pParam;
       ...
       delete pThreadParams;
 
       return 0;
}

Thread ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ

//Thread๋ฅผ ์ž ์‹œ ์ค‘์ง€์‹œํ‚ค๊ณ  ์‹ถ์„ ๋•Œ๋Š” ์ฃผ Process์—์„œ
pThread->SuspendThread();
 
//๋‹ค์‹œ ๋Œ๋ฆฌ๊ณ  ์‹ถ์„ ๋•Œ๋Š” ์ฃผ Process์—์„œ
pThread->ResumeThread();

Thread ์ค‘์ง€ ์‹œํ‚ค๊ธฐ

UINT ThreadPrintNum(LPVOID pParam)
{
       BOOL *pbContinue = (BOOL *)pParam;
       while ( *pbContinue )
       {
             โ€ฆ
       }
       return 0;
}
// ์™ธ๋ถ€์—์„œ pbContinue๋ฅผ false์‹œํ‚จ๋‹ค.

Thread๊ฐ€ ์™„์ „ํžˆ ์ฃฝ์—ˆ๋Š”์ง€ ํ™•์ธ

DWORD result;
result = ::WaitForSingleObject(pThread->m_hThread, 1000);   // 1์ดˆ๊ธฐ๋‹ค๋ฆผ
if ( result == WAIT_OBJECT_0 )
{
       // ์ด๊ณณ์€์“ฐ๋ ˆ๋“œ๊ฐ€ํ™•์‹คํžˆ์ข…๋ฃŒ๋œ์ƒํƒœ์ž„
}
else if ( result == WAIT_TIMEOUT )
{
       // 1์ดˆ๊ฐ€์ง€๋‚˜๋„์“ฐ๋ ˆ๋“œ๊ฐ€์ข…๋ฃŒ๋˜์ง€์•Š์€์ƒํƒœ
}

Userthread

class CUIThread : public CWinThread
{
       DECLARE_DYNCREATE(CUIThread)
public:
       virtual BOOL InitInstance();
};
IMPLEMENT_DYNCREATE(CUIThread, CWinThread)
 
BOOL CUIThread::InitInstance()
{
       m_pMainWnd = new CMyDialog;
       m_pMainWnd->ShowWindow(SW_SHOW);
       m_pMainWnd->UpdateWindow();
       return TRUE;
}
CWinThread *pThread = ::AfxBeginThread(RUNTIME_CLASS(CUIThread));
CMyDialog::CMyDialog(CWnd* pParent /*=NULL*/)
       : CDialog(CMyDialog::IDD, pParent)
{
       Create(IDD_MYDIALOG, NULL);
}

์ด์ œ ์™„์ „ํžˆ ๋ณ„๋„๋กœ ๋™์ž‘ํ•˜๋Š”(Thread๋กœ ๋™์ž‘ํ•˜๋Š”) ์œˆ๋„์šฐ๋ฅผ ํ•˜๋‚˜ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด๋‹ค.


์ฐธ๊ณ ์‚ฌ์ดํŠธ