ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ
170
управлением ОС WINDOWS. Процессоры будем эмулировать путем запуска от-
дельных потоков.
Измените программу таким образом, чтобы дочерний поток не содержал опе-
раций отрисовки. Отрисовку должен выполнять главный поток путем обмена сооб-
щениями с дочерним. Например, после завершения обработки очередной области,
дочерний поток посылает сообщение главному, в котором передает координаты об-
работанной области и полученные данные, а главный поток производит соответст-
вующие операции.
Для посылки сообщений служат функции PostMessage и SendMessage. Post-
Message помещает сообщение в очередь окна и возвращается, а SendMessage поме-
щает сообщение и ожидает оканчания его обработки. Удобно пользоваться пере-
груженными версиями этих функций, которые определены для класса диалогового
окна:
DWORD CDlg.PostMessage(int Message_ID,int lParam, int wParam);
DWORD CDlg.SendMessage(int Message_ID,int lParam, int wParam);
Здесь
Message_ID –
идентификатор сообщения. Пользовательские сообщения
должны начинаться с константы WM_USER:
#define MyMessage WM_USER+10
Как добавить обработчик сообщения? К сожалению, Class Wizard не умеет до-
бавлять обработчики пользовательских сообщений, и это придется делать вручную.
Сначала надо добавить к классу диалога функцию-обработчик, которая воз-
вращает void и принимает два целых параметра – параметры сообщения. На вкладке
Classes левого окна выбираем имя диалога, правой кнопкой кликаем на имени клас-
са диалога, и выбираем AddFunction. Компилятор добавляет функцию, например –
такую:
void CPrDlg::OnMy(LPARAM l, WPARAM p)
В ней мы напишем текст обработчика сообщения.
Теперь свяжем сообщение с кодом обработчика. Найдите код, начинающийся
с макроса
BEGIN_MESSAGE_MAP(CPrDlg, CDialog)
. Этот участок кода называется
картой сообщений (message map). Он связывает сообщения с их обработчиком, и
выглядит примерно так:
BEGIN_MESSAGE_MAP(CPrDlg, CDialog)
//{{AFX_MSG_MAP(CPrDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)