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.