Шаг 63 - Многозадачность

Создание проекта

Создаем проект на базе диалогового окна. Убедитесь, что у Вас стоит поддержка многопоточных приложений.

63_1.gif (4439 b)

Помещаем кнопку и функцию, связанную с ее нажатием.

63_2.gif (2404 b)

Создаем код

Создаем две функции для потоков.

UINT proc1(LPVOID Param)
{
for (int x=1;x<30;x++)
{
Sleep(100); // задержка
}
AfxMessageBox("proc1");
return 0;
}
UINT proc2(LPVOID Param)
{
for (int x=1;x<30;x++)
{
Sleep(100); // задержка
}
AfxMessageBox("proc2");
return 0;
}

Создаем реакцию на нажатие кнопки для запусков потоков.

void CMy63Dlg::OnButton1() 
{
AfxBeginThread(proc1,this); // Первый поток
AfxBeginThread(proc2,this); // Второй поток
AfxMessageBox("Thread"); // И основной поток
}

Программа в работе.

63_3.gif (5885 b)

Описание

Основу кода составляет 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 );

Указатель на функцию в потоке должен иметь вид.

UINT MyControllingFunction( LPVOID pParam );

Второй параметр устанавливает приоритет выполнения функции. Я использовал this для того, чтобы функции потока имели тот же приоритет, что и программа. Но установка этих параметров Ваше право. Собирайте, запускайте.

Смотрите последовательность выполнения. OnButton1 не остановилась на процедурах, а запустила их в виде потоков и выполняется дальше, о чем говорят диалоговые окна Thread, потоки завершаются позднее и примерно в одно время, как и начинались. Когда выполнение приложения распределено на несколько направлений, выполнение каждого из которых не зависит от другого. Якобы не зависит. Процессор то один. Но в нашем случае в процедурах реализованы задержки, которые не требуют процессорного времени и влияние друг на друга у них маленькое.

Шпаргалка

Проверить, что приложение сможет использовать потоки.

Project  - Setting - C/C++ - Code Generation - Use Run-Time Library

Реализовать функции потоков.

UINT proc1(LPVOID Param)
{
..........
}

Запустить поток.

AfxBeginThread(proc1,this);	// Первый поток

Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.