UINT ThreadProc (LPVOID param)
{
...
}
void on_start()
{
HWND hWnd = GetSafeHwnd();
AfxBeginThread(ThreadProc, hWnd, THREAD_PRIORITY_NORMAL);
...
}
Thread и его параметры.
1. Как правильно передавать в Thread параметры, если их несколько?
В учебнике есть такой пример:
Код:
2. Как из Thread получить доступ, предположим, к progress bar основного диалогового окна, зная hWnd последнего?
Создаем объект в header-e:
Код:
CProgressCtrl m_progress;
Далее основная часть:
Код:
UINT ThreadProc(LPVOID param)
{
::MessageBox((HWND)param, "Thread activated.", "Thread", MB_OK);
::SetDlgItemText((HWND)param, IDC_EDIT1, "HELLO");
/* Почему этот объект не виден? */
m_progress.SetPos(5);
return 0;
}
void CMyTestDlg::OnOK()
{
HWND hWnd = GetSafeHwnd();
AfxBeginThread(ThreadProc, hWnd, THREAD_PRIORITY_NORMAL);
}
{
::MessageBox((HWND)param, "Thread activated.", "Thread", MB_OK);
::SetDlgItemText((HWND)param, IDC_EDIT1, "HELLO");
/* Почему этот объект не виден? */
m_progress.SetPos(5);
return 0;
}
void CMyTestDlg::OnOK()
{
HWND hWnd = GetSafeHwnd();
AfxBeginThread(ThreadProc, hWnd, THREAD_PRIORITY_NORMAL);
}
Если это так, то у тебя ThreadProc является глобальной функцией, поэтому ей не видны ни методы, ни члены класса CMyTestDlg.
Попробуй так:
Код:
UINT ThreadProc(LPVOID param)
{
if(!param)
return 0;
CMyTestDlg* pMyTestDlg = (CMyTestDlg*) param;
pMyTestDlg->m_progress.SetPos(5);
return 0;
}
void CMyTestDlg::OnOK()
{
AfxBeginThread(ThreadProc, this, THREAD_PRIORITY_NORMAL);
}
{
if(!param)
return 0;
CMyTestDlg* pMyTestDlg = (CMyTestDlg*) param;
pMyTestDlg->m_progress.SetPos(5);
return 0;
}
void CMyTestDlg::OnOK()
{
AfxBeginThread(ThreadProc, this, THREAD_PRIORITY_NORMAL);
}
Спасибо большое. Я упустил this.