Мы поможем в написании ваших работ!
ЗНАЕТЕ ЛИ ВЫ?
|
Критическая секция, ее применение в нашем проекте
Содержание книги
- 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)
Критическая секция, ее применение в нашем проекте
Критической секцией называется участок кода, в котором поток получает «монопольный» доступ к разделяемому ресурсу, доступному и другим потокам(обычно это участок памяти, относящийся к глобальной переменной).
MFC предоставляет класс CCriticalSection, инкапсулирующий этот механизм Win32.
· Конструкторэтого классаподготавливает запуск механизма синхронизации.
CCriticalSection::CCriticalSection( )
· Метод
BOOL CCriticalSection::Lock( )
запрашивает разрешение на вход в критическую секцию: если другой поток находится в своем критическом участке кода, то поток, вызвавший Lock, блокируется, пока тот не покинет критический участок (возвращает TRUE в случае успешной операции):
· Метод
virtual BOOL CCriticalSection::Unlock ( )
уведомляет систему о выходе потока из критического участка(поэтому должен вызываться сразу после окончания работы с ресурсом в данном потоке). Возвращает значение TRUE, если объект CCriticalSection до сих пор принадлежал данному потоку и освобождение прошло успешно.
· Деструктор освобождает системный ресурс, отвечающий за данный критический участок.
При входе какого-либо потока в критическую секцию, все потоки, не требующие в данный момент входа в критическую секцию, продолжают нормально выполняться.
В нашем приложении данный класс поможет сделать более содержательной работу с переменной g_dfpp: если рабочий поток будет записывать туда значение целевой функции в режиме CriticalSection, то основной поток сможет отображать эти значения в процессе вычислений. Без дополнительных предосторожностей такой обмен данными делать нельзя, т.к., если во время чтения вещественной переменной произойдет модификация одного из байт, кодирующих ее, то прочитанное значение, скорее всего, будет некорректным.
Чтобы воспользоваться этим средством вставим вначале функции, содержащей главный цикл решателя, конструктор
|