MFC позволяет нам создавать процессы. Но кроме того мы может передать в процесс и указатель на объект, с которым этот процесс будет работать. Давайте пробовать. Создаем приложение MFC AppWizard на базе диалогового окна с именем TestThread, помещаем на окно кнопку и элемент управления список.

Элемент управления список связываем с переменной типа CListBox используя Classwizard.
......
class CTestThreadDlg : public CDialog
{
// Construction
public:
CTestThreadDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CTestThreadDlg)
enum { IDD = IDD_TESTTHREAD_DIALOG };
CListBox m_List;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTU
......
И пишем код к кнопке создавая поток:
UINT Threads(LPVOID pParam)
{
CListBox *cb=(CListBox*) pParam;
for (int x=1;x<10000;x++)
{
cb->AddString("Hello");
}
AfxMessageBox("Thread");
return 0;
}
void CTestThreadDlg::OnStart()
{
// TODO: Add your control notification handler code here
AfxBeginThread(Threads,&m_List);
AfxMessageBox("Ok");
}
Заполнение списка будет производиться из другого потока. Мы передаем через параметры адрес переменной AfxBeginThread(Threads,&m_List); при запуске потока, а потом восстанавливаем ее в потоке CListBox *cb=(CListBox*) pParam;, так как передали через указатель без типа. Запускайте. Сначала Вы получите сообщение OK, а только через некоторое время, когда поток быдет выполнен, Thread.