int FuncNum; //Номер целевой функции
Содержание книги
- afx_msg void OnLButtonUP(UINT nFlags, CPoint point);
- Nmhdr *pnotifystruct, //указатель на структуру с данными
- Посылает сообщение в объект класса cwnd или его потомка, непосредственно вызывая оконную процедуру, и не выходит из нее, пока та не обработает сообщение;
- strMessageText.Format("Error number %d", nError);
- Архитектура «Документ-представление» и MDI-приложения
- HMENU CMDIChildWnd::m_hMenuShared
- дескриптор меню, ассоциированного с окном “MDI child”.
- CDocument* CView:: GetDocument()
- Динамическое создание с помощью конструктора
- virtual POSITION CDocument::GetFirstViewPosition()
- Класс шаблона cdoctemplate в приложении отвечает за взаимодействие документов, их представлений и фреймов. В MDI приложении используется его потомок cmultidoctemplate.
- CMultiDocTemplate* pDocTemplate;
- CFrameWnd* pFrame,CDocument* pDoc, BOOL bMakeVisible=TRUE);
- POSITION CWinApp::GetFirstDocTemplatePosition()
- Документ, связанный с активным представлением
- AFX_THREADPROC pfnThreadProc, // Глобальная функция потока
- UINT Msg, // идентификатор сообщения
- Solver* pSolver; //Solver to use
- virtual CDocument* CFrameWnd::GetActiveDocument()
- SendMessage(WM_COMMAND,ID_FILE_SAVE,0);
- while (::GetMessage(&msg, NULL,0,0))
- Объекты, объявленные как volatile, не подвержены оптимизации и временному хранению в регистрах, но читаются и записываются каждый раз напрямую в память.
- if (!m_thisThreadParams.pResults) return 1;
- if (m_thisThreadParams.pResults)
- ID_SEPARATOR, // status line indicator
- m_wndStatusBar.SetPaneText(1,"");
- TODO: Add your message handler code here
- Нажимаем на элементе “решить” мышку и переносим его на место между пунктами ”window” и ”help” (для порядка).
- Separator – элемент представляет собой горизонтальную разделительную линию
- Object IDs:-> IDM_SOLVE_CONV.
- Шаблон диалога, хранящийся в файле ресурсов, описывает форму, размер и расположение на экране блока диалога и каждого из его внутренних элементов управления.
- CMyDialog::CMyDialog(CWnd* pParent /*=NULL*/)
- правой кнопкой)->Ok->Properties->ID:"IDC_START"
- В правом верхнем углу ставим Static Text "&Начальная точка:".
- Имя этого класса должно обязательно (. ) соответствовать вашему методу решения задачи выпуклой оптимизации. Иначе задача на практике приниматься не будет.
- class CMyDialog : public CDialog
- BOOL cwnd::updatedata( BOOL bsaveandvalidate = TRUE )
- void CMyDialog::DoDataExchange(CDataExchange* pDX)
- Vs2005: правой кнопкой на элементе -> Add variable)
- View->ClassWizard->Message Maps->ClassName:"CDFPDialog"->
- int CListBox::AddString( LPCTSTR lpszItem )
- int CListBox::DeleteString( UINT nIndex )
- обновляет содержимое элементов управления на экране
- void CDFPDialog::OnSelchangeCoordList()
- BOOL cwnd::enablewindow(bool benable = TRUE)
- int FuncNum; //Номер целевой функции
- Критическая секция, ее применение в нашем проекте
- И на каждой итерации перед обновлением поля goalvalue вставим
- ResourceView->Optimizer resources –R->
- void CDFPDialog::OnTimer(UINT nIDEvent)
struct DFPPARAMS
{
double eps; //точность
int FuncNum; //Номер целевой функции
int IterNum; //Номер текущей итерации
int n; //Размерность задачи
double* x0; //Начальная точка и вектор-результат
double GoalValue;//Текущее значение целевой функции
bool Terminate;//Требование останова
HWND CallingWin;//Идентификатор вызывающего окна
bool Error; //Флаг наличия ошибки в решателе
};
Определяем глобальную переменную в "DFPDialog.cpp":
DFPPARAMS volatile g_dfpp;
Если эта переменная не видна в каком-то из файлов – объявим ее через extern вначале подходящего заголовочного файла:
extern DFPPARAMS volatile g_dfpp;
Оповещение основного потока о завершении рабочего потока должно выполняться новым пользовательским сообщением (сообщение, используемое решателем задачи из файла тут не подходит, т.к. одновременно могут выполняться оба рабочих потока и может быть неясно какой из них закончил работу). Создаем для него идентификатор в файле "Optimizer.h":
#define WM_THREADFINISHED_DFP WM_USER+6
и обработчик OnThreadFinishedDFP в классе диалога (по аналогии с обработчиком сообщения WM_THREADFINISHED, обсуждавшимся ранее). Теперь, однако, нам не потребуется модифицировать строку состояния. Вместо этого нужно вернуться к исходному состоянию кнопок "Start" и "Stop":
GetDlgItem(IDC_START)->EnableWindow(TRUE);
GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
Проверим последовательность обращения к элементам управления в нашем диалоговом окне на случай, если пользователь будет обращаться к ним не при помощи мышки, а с использованием клавиши табуляции. Выберите мышкой в редакторе ресурсов диалоговое окно или один из элементов управления. В главном меню выберите Layout -> Tab Order. При этом все элементы управления в пользовательском окне будут пронумерованы. В соответствии с присвоенными номерами осуществляется и доступ при нажатии пользователем табуляции.
Каждый элемент StaticText должен иметь номер на единицу меньший, чем соответствующий ему элемент управления, получающий ввод от пользователя (конечно, если такой существует). В случае сопоставления какому-либо элементу Static Text «горячей» клавиши, с ней будет связан элемент управления, стоящий следом за данным StaticText.
С помощью мышки установите нужный порядок обращения к элементам управления. Для этого щелкните мышкой на каждом элементе управления в нужном порядке. После этого вызовите из основного меню Layout->Tab Order и режим установки порядка будет отменен.
Кроме того, следует проверить корректность назначения элементам управления "горячих клавиш". Важно проследить за тем, чтобы одна и та же буква не использовалась в качестве горячей клавиши более одного раза. Для этого нужно осуществить следующие действия:
Щелкните на каком-либо элементе управления правой кнопкой мыши и выберите Check Mnemonics. Если обнаружены конфликты, то вам будет предложено сделать исправления.
|