.... class CWinApp : public CWinThread { .....Класс CWinThread - это потоки выполняемые в приложении. Главный поток - это обычно CWinApp. Вообще-то потоки делятся на два типа:
CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ); CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );Видите разницу ??? В первом случае передается адрес процедуры, а во втором адрес класса. Поток может быть создан и из конструктора класса, от которого он унаследован только в таком случае необходимо вызвать CreateThread. Вообще любое приложение Win32 состоит из одного или нескольких процессов. Процесс в простом виде это выполняемое приложение. Операционная система распределяет время в соотвествии со статусами процесса. Именно процесс обеспечивает программу ресурсами, как ,например, адресное пространство, указатели, переменные операционной среды и так далее. Каждый процесс может породить дополнительные процессы.
Давайте создадим свой процесс на нашем диалоговом окне.
UINT MyFunction( LPVOID pParam ) { for (int x=1;x<10;x++) { Sleep(1000); MessageBeep(-1); } return 0; } void CTestAppDlg::OnButton6() { CWinThread* myWinThread = AfxBeginThread(*MyFunction, NULL); }Итак Вы нажимаете на кнопку и процес запускается. Вы можете дальше продолжать свою работу в то время как производится выполнение процесса и компьютер бибикает. Как же работает AfxBeginThread ??? А вот пример.
CWinThread* pThread = DEBUG_NEW CWinThread(pfnThreadProc, pParam); ASSERT_VALID(pThread); if (!pThread->CreateThread(dwCreateFlags|CREATE_SUSPENDED, nStackSize, lpSecurityAttrs))Как видите создается новый объект CWinThread и вызывается его функция CreateThread. Соотвественно можно делать и так. Например, поменять код в функции:
void CTestAppDlg::OnButton6() { //CWinThread* myWinThread = AfxBeginThread(*MyFunction, NULL); CWinThread* myTh; myTh=new CWinThread(*MyFunction,NULL); myTh->CreateThread(); }
Сам же MFC использует функции _beginthread из Win32 API для создания потоков.