Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том2)" -> 119

Visual С++ 6. Полное руководство: В 2 т.(том2) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том2) — Бином, 2006. — 530 c.
Скачать (прямая ссылка): vicualcc2006t2.djvu
Предыдущая << 1 .. 113 114 115 116 117 118 < 119 > 120 121 122 123 124 125 .. 173 >> Следующая

Наконец, поток может передавать сигналы другим потокам или синхронизировать их работу, используя глобальную переменную (например, использование глобального флажка StopDraw в программе MandelMT).
Многопотоковая версия программы Mandel
Вспомните, что в программе Mandel (см. гл. 19) первичный поток программы рисует один столбец рекурсивного изображения и обрабатывает любое поступающее сообщение. Затем рисует другой столбец и обрабатывает сообщение и так далее. Эта процедура позволяет программе отвечать на сообщения, пока рисуется изображение (это может занимать много времени). В многопотоковой версии программы, названной MandelMT, показано, что в случае, когда программа должна одновременно решать несколько задач, эффективнее и легче задать для каждой главной задачи отдельный поток. В программе MandelMT первичный поток создает сообщения, а вторичный — рисует рекурсивное изображение. Программа MandelMT реагирует на запросы быстрее, чем Mandel, так как первичный поток может обработать сообщение, не ожидая окончания рисования текущего столбца изображения. Программа MandelMT проще еще и потому, что код, выполняемый каждым потоком, решает только собственную задачу, не переключаясь на другие задачи. Например, программа рисования рекурсивного изображения просто рисует его целиком, не сохраняя его состояние и не делая возвраты после рисования каждого столбца.
Использование многопоточного режима в среде Windows может привести к некоторым программным сложностям, которыми нужно управлять. Например, вторичному потоку необходимо запретить рисовать в окне, пока первичный поток
передвигает или модифицирует окно. Кроме того, отдельные потоки не могут свободно использовать объекты MFC-классов, что было описано ранее.
При создании программы MandelMT используется мастер AppWizard для генерации нового набора исходных файлов (вместо изменения исходных файлов программы Mandel). Фрагмент из программы Mandel в программу MandelMT можно скопировать всегда. При генерации исходных файлов назовите проект MandelMT, а в диалоговых окнах мастера AppWizard (Step 1 — Step 6) выберите такие же установки, как и в программе WinGreet (см. гл. 9).
После генерации исходных кодов откройте файл MandelMTView.h и определите переменную m_PDrawThread класса представления.
class CMandelMTView : public CView t
public:
CWinThread *m_PDrawThread;
Переменная m_PDrawThread используется для хранения адреса объекта, управляющего вторичным потоком.
Откройте файл MandelMTView.cpp и добавьте в конструктор класса представления код для инициализации экземпляра m_PDrawThread.
CMandelMTView::CMandelMTView() {
// TODO: здесь добавьте код конструктора m_PDrawThread = 0;
}
Добавьте фрагмент программы для удаления объекта потока деструктором класса.
CMandeIMTView::-CMandeIMTView() {
delete m_PDrawThread;
}
В начало файла MandelMTView.cpp добавьте следующие определения.
// MandMTView.срр : реализация класса CMandelMTView //
ttinclude "stdafx.h" tinclude "MandelMT.h"
ttinclude "MandelMTDoc.h" tinclude "MandelMTView.h"
#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE
static char THIS_FILE[] = _FILE_;
ttendif
// Константа множества Мандельброта:
#define СШАХ 1.2
#define CIMIN -1.2
#define CRMAX 1.0
#define CRMIN -2.0
idefine ШАХ 128
// Глобальные переменные для связи между потоками: int ColMax; int RowMax; BOOL StopDraw;
Константы множества Мандельброта (cimax и другие) такие же, как определенные в программе Mandel. Для хранения текущих размеров окна представления используются переменные ColMax и RowMax. В программе MandelMT это — глобальные переменные, а не переменные класса представления. Таким образом оба потока могут иметь к ним свободный доступ (вспомните ограничения на доступ к объектам MFC-классов множества потоков). Переменная StopDraw — это флажок, используемый первичным потоком для передачи сигнала вторичному потоку (для немедленного возврата без завершения рисования текущего изображения).
Создайте обработчик сообщений для функции wm_SIZE. Для этого в окне мастера ClassWizard откройте вкладку Message Maps, в списках Class Name и Object Ids выберите MandelMTView, а в списке Messages — wm_SIZE. Щелкните на кнопке Add Function, затем — на кнопке Edit Code и добавьте в функцию OnSize следующий фрагмент.
void CMandelMTView::OnSize(uint nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy) ;
// TODO: Здесь добавьте собственный код обработчика
if (cx <= 1 И су <= 1) return;
ColMax = cx; RowMax = cy;
)
Функция OnSize получает управление при первом создании окна и изменении его размеров, а также устанавливает значения глобальных переменных RowMax и ColMax, используемых программой рисования для определения общего размера окна представления.
В функцию OnDraw файла MandelMTView.cpp добавьте следующий фрагмент.
void CMandelMTView::OnDraw(CDC* pDC) {
CMandelMTDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);
// TODO: здесь добавьте код отображения собственных данных
if (m_PDrawThread) {
StopDraw = TRUE; m_PDrawThread->ResumeThread (); ::WaitForSingleObject
Предыдущая << 1 .. 113 114 115 116 117 118 < 119 > 120 121 122 123 124 125 .. 173 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100