|
http://tikitak.narod.ru ---- Главная страница сайта
Шаг 63 - Многозадачность
Создаем проект
Создаем с использованием AppWizard приложение на базе диалогового окна, отключив всё, что можно, на диалоговом окне создать кнопку, процедуру реакции на неё, и реакцию на нажатие клавишей мышки на диалоговом окне. Вы можете посмотреть необходимые операции в предыдущих шагах.
Создаем код
Реакция на нажатие кнопки мыши и необходимые процедуры
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 CTestdiaDlg::OnButton1()
{
AfxBeginThread(proc1,this);
AfxBeginThread(proc2,this);
AfxMessageBox("Thread");
}
Процедура нажатия кнопки на диалоговом окне
void CTestdiaDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnLButtonDown(nFlags, point);
MessageBeep(-1);
}
Описание
Основу кода составляет 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, потоки завершаются позднее и примерно в одно время, как и начинались. Запустите еще раз и нажмите на кнопку OK окна сообщения Thread. Вы можете щелкать по диалоговому окну и оно будет откликаться звуком. То есть это говорит о том, что несмотря на то, что код функций еще не закончился окно получает сообщения от мышки и их обрабатывает. Это и есть потоки. Когда выполнение приложения распеределено на несколько направлений, выполнение каждого из которых не зависит от другого. Якобы не зависит. Процессор то один :-))). Но в нашем случае в процедурах реализованы задержки, которые не требуют процессорного времени и влияние друг на друга у них маленькое.
Предыдущий Шаг | Следующий Шаг | Оглавление By Artem.
Используются технологии uCoz
|