C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 128 - CWinThread / MFC шаг за шагом / Visual C++

Шаг 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 для создания потоков.


| |
Автор Каев Артем.
[AD]