Solver* pSolver; //Solver to use 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Solver* pSolver; //Solver to use

Поиск

Solver* pSolver; //Solver to use

Results* pResults; //Ponter to results to be optained

HWND hWnd;   //Handler of the associated MDI-child window

};

 

Исходный код функции потока в “Optimizer.cpp” можно написать примерно следующий:

 

UINT SolveFunction( LPVOID pParam )

{

ThreadParams* pIn = (ThreadParams*)pParam;

try

{

    pIn->pSolver->Solve(pIn->pProblem, pIn->pResult);

    ::PostMessage(pIn->hWnd, WM_THREADFINISHED,0,0);

}

catch (Error&er)

{

    er.ErrorMessage();

    ::PostMessage((HWND) pIn->hWnd, WM_THREADERROR,0,0);

}

return 0;

}

 

Запуск рабочего потока командным сообщением

 

Для начала научимся передавать требование запустить решатель для задачи, загруженной в текущее MDI-child окно, с помощью пользовательской клавиши-акселератора <Ctrl> + <T>.

Для создания новой клавиши-акселератора зайдем в соответствующий раздел ресурсов: ResourceView->Optimizer resources->Accelerator->IDR_MAINFRAME (double click) и выберем двойным щелчком последнюю (пустую) строку в таблице клавиш-акселераторов. В окошке Accel Properties в поле Key: выберем нужную нам клавишу “T” и введем в поле ID: имя ее идентификатора, например, “ID_SOLVE_THIS”. Галочка в группе Modifiers должна стоять только при Ctrl. Жмем <Enter>- и новая клавиша-акселератор добавлена в список. Теперь каждый раз при нажатии <Ctrl> + <T> текущий фрейм (имеющий тип CChildFrame) будет получать сообщение WM_COMMAND с идентификатором объекта-отправителя ID_SOLVE_THIS.

 

Чтобы написать обработчик нового сообщения WM_COMMAND, воспользуемся “услугами” мастера ClassWizard: View->ClassWizard. Открываем вкладку->Message Maps, которая предназначена для просмотра сообщений, связанных с каждым объектом Windows и для создания соответствующих обработчиков.Выбираем имя нужного класса: Class name->”CChildFrame" и новую клавишу-акселератор в поле объектов Windows: Object IDs:-> ID_SOLVE_THIS.После этого мастер в списке Messages покажет все сообщения, связанные с этим объектом. Выбираем наше сообщение и добавляем обработчик для него: Messages:->”COMMAND”->Add Function и соглашаемся с предложенным именем функции “OnSolveThis”.

 

Итак, у нас есть обработчик, который ответственен за запуск рабочего потока. Как организовать ввод задачи, т.е. передачу данных из документа в класс CProblem. Здесь можно предложить 2 способа.

 

1 способ (неправильный, но более простой): сохранение данных документа в текстовом файле. Данный способ удобен, если алгоритм уже реализован в консольном приложении, которое читает исходные данные из файла. К его недостаткам можно отнести то, что пользователь обязан сохранить исходные данные в файле перед тем, как начать расчет.

 

Для того, чтобы сохранить изменения, которые могли быть сделаны в текущем дочернем фрейме, мы пошлем командное сообщение в главный фрейм, снабдив его идентификатором ID_FILE_SAVE: вызываем уже известную нам функцию SendMessage и файл будет сохранен, если в окне имеются изменения. В случае если это вновь созданный документ, нам будет предложено стандартное окно "Сохранить как" для выбора имени файла.

 

Чтобы получить имя файла, в котором мы сохранились (оттуда мы прочитаем входные данные задачи) сначала получим указатель на документ функцией:



Поделиться:


Последнее изменение этой страницы: 2024-06-27; просмотров: 46; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.21 (0.008 с.)