Шаг 128 - CWinThread

CWinApp порожден от CWinThread:
....
class CWinApp : public CWinThread
{
.....
Класс CWinThread - это потоки выполняемые в приложении. Главный поток - это обычно CWinApp. Вообще-то потоки делятся на два типа: Как раз CWinApp порожден с помощью интерфейсного потока. Создается поток функцией AfxBeginThread, которая имеет две версии в соотвествии с типами потоков.
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 для создания потоков.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 3.03.2000