diff --git "a/2020302111036-\345\210\230\345\272\267\345\215\232.md" "b/2020302111036-\345\210\230\345\272\267\345\215\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..a4c46539eeae43fe59c8094307fb660ae9bddefe --- /dev/null +++ "b/2020302111036-\345\210\230\345\272\267\345\215\232.md" @@ -0,0 +1,335 @@ +# 第七周作业 2020302111036-刘康博 + +# 一、查找并阅读MVVM有关思想 + +## (1) 什么是MVVM + +MVVM是Model-View-ViewModel的简写。它本质上就是MVC的改进版。MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。当然这些事 ViewModel 已经帮我们做了,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑。微软的WPF带来了新的技术体验,如Silverlight、音频、视频、3D、动画……,这导致了软件UI层更加细节化、可定制化。同时,在技术层面,WPF也带来了 诸如Binding、Dependency Property、Routed Events、Command、DataTemplate、ControlTemplate等新特性。MVVM(Model-View-ViewModel)框架的由来便是MVP(Model-View-Presenter)模式与WPF结合的应用方式时发展演变过来的一种新型架构框架。它立足于原有MVP框架并且把WPF的新特性糅合进去,以应对客户日益复杂的需求变化。MVVM核心思想,是关注model的变化,让MVVM框架利用自己的机制自动更新DOM,也就是所谓的数据-视图分离,数据不会影响视图。 + + 在MVVM架构中,是不允许数据和视图直接通信的,只能通过ViewModel来通信,而ViewModel就是定义了一个Observer观察者。ViewModel是连接View和Model的中间件。 + MVVM源自于经典的MVC(Model-View-Controller)模式。MVVM的核心是ViewModel层,负责转换Model中的数据对象来让数据变得更容易管理和使用,其作用如下: + 该层向上与视图层进行双向数据绑定。 + 向下与Model层通过接口请求进行数据交互。 + MVVM已经相当成熟了,主要运用但不仅仅在网络应用程序开发中。当下流向的MVVM框架有Vue.js、AugularJS等。 + + +## (2) MVVM优点和缺点 + +优点: +1. 低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。 +2. 可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。 +3. Controller简洁清晰。ViewModel分离出来大部分的Controller代码,更加清晰和容易维护。 +4. 独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xaml代码。 +5. 方便测试。大部分Bug来自于逻辑处理,由于ViewModel把逻辑分离出来,可对ViewModel构造单元测试。 +缺点: +1. Bug 很难被调试 : 因为使⽤双向绑定的模式,当你看到界⾯异常了,有可能是你 View 的代码有 Bug ,也可能是 Model 的代码有问题。数据绑定使得⼀个位置的Bug 被快速传递到别的位置,要定位原始出问题的地⽅就变得不那么容易 了。另外,数据绑定的声明是指令式地写在View 的模版当中的,这些内容是没办法去打断点 debug 的。 +2. ⼀个⼤的模块中 model 也会很⼤,虽然使⽤⽅便了也很容易保证了数据的⼀致性,当时⻓期持有,不释放内存就造 成了花费更多的内存。 +3. 对于⼤型的图形应⽤程序,视图状态较多, ViewModel 的构建和维护的成本都会⽐较⾼。 + +## (3) MVVM的组成部分 + +模型 +模型是指代表真实状态内容的领域模型(面向对象),或指代表内容的数据访问层(以数据为中心)。 + +视图 +就像在MVC和MVP模式中一样,视图是用户在屏幕上看到的结构、布局和外观(UI)。 + +视图模型 +视图模型是暴露公共属性和命令的视图的抽象。MVVM没有MVC模式的控制器,也没有MVP模式的presenter,有的是一个绑定器。在视图模型中,绑定器在视图和数据绑定器之间进行通信。 + +绑定器 +声明性数据和命令绑定隐含在MVVM模式中。在Microsoft解决方案堆中,绑定器是一种名为XAML的标记语言。绑定器使开发人员免于被迫编写样板式逻辑来同步视图模型和视图。在微软的堆之外实现时,声明性数据绑定技术的出现是实现该模式的一个关键因素。 + +## (4) MVVM的理论基础 + +MVVM旨在利用WPF中的数据绑定函数,通过从视图层中几乎删除所有GUI代码(代码隐藏),更好地促进视图层开发与模式其余部分的分离。不需要用户体验(UX)开发人员编写GUI代码,他们可以使用框架标记语言(如XAML),并创建到应用程序开发人员编写和维护的视图模型的数据绑定。角色的分离使得交互设计师可以专注于用户体验需求,而不是对业务逻辑进行编程。这样,应用程序的层次可以在多个工作流中进行开发以提高生产力。即使一个开发人员在整个代码库上工作,视图与模型的适当分离也会更加高效,因为基于最终用户反馈,用户界面通常在开发周期中经常发生变化,而且处于开发周期后期。 +MVVM模式试图获得MVC提供的功能性开发分离的两个优点,同时利用数据绑定的优势和通过绑定数据的框架尽可能接近纯应用程序模型。它使用绑定器、视图模型和任何业务层的数据检查功能来验证传入的数据。结果是模型和框架驱动尽可能多的操作,消除或最小化直接操纵视图的应用程序逻辑(如代码隐藏)。 + +# 二、熟悉WPF窗体 + +1、 Button(按钮):表示 Windows 按钮控件,该按钮对 Click 事件做出反应。 +常用属性介绍 Background:元素的背景色; Foreground:前景色; Width/Height:宽度/高度; + BorderBrush:元素边框颜色; BorderThickness:元素边框宽度; + Command:获取或设置在按下按钮时调用的命令。 + CommandBindings:获取与此元素关联的 CommandBinding 对象的集合。 CommandBinding 为此元素启用命令处理,并声明命令、命令的事件和由此元素附加的处理程序之间的链接。 + CommandParameter:获取或设置要传递给 Command 属性的参数。 + Content:获取或设置 ContentControl 的内容。 + ContentStringFormat:获取或设置一个撰写字符串,该字符串指定如果 Content 属性显示为字符串,应如何设置该属性的格式。 + ContentTemplate :获取或设置用于显示 ContentControl 内容的数据模板。 + FontFamily:字体名称; FontSize:字体大小; FontStretch:字体在屏幕上紧缩或加宽的程度; FontWeight:字体粗细; + ClickMode:获取或设置 Click 事件何时发生。ClikMode值有如下三种,具体解析如下: + Release:指定当按下和释放按钮时应引发Click 事件。 + Press:指定当按下按钮时应引发Click 事件。 + Hover:指定当鼠标悬停在控件上时应引发Click 事件。 + +2、Label 文本标签 表示包含一段任意类型内容的控件。也可以叫标签控件。 + Lable 常用属性 + Background:背景; Foreground前景色(字体颜色) + BorderBrush:用于描述控件的边框背景的画笔。 + BorderThickness:获取或设置控件的边框宽度。 + Content:获取或设置 ContentControl 的内容。 + FontFamily:获取或设置控件的字体系列。 + FontSize:获取或设置字号。 + FontStretch:获取或设置字体在屏幕上紧缩或加宽的程度。 + FontStyle:获取或设置字体样式。 + FontWeight:获取或设置指定字体的粗细。 + Width/Height:宽度/高度。 IsEnabled:使能是否可用。 Name:元素标识名称。 + Opacity:透明度。 Margin:元素的外边距。 + HorizontalAlignment/VerticalAlignment:获取或设置在父元素(如面板或项控件)中组合此元素时所应用的水平/垂直对齐特征。 + HorizontalContentAlignment/VerticalContentAlignment:获取或设置控件内容的水平/垂直对齐方式。 + +3、TextBox :文本输入框控件,是WPF中最基本的文字输入控件。它允许最终用户在一行、对话输入、或多行编写,就像是个编辑器。 +常用属性介绍 + Background:背景; BorderBrush:边框背景的颜色; BorderThickness:边框宽度; + CanRedo:是否可重做最新的撤消操作; CanUndo:是否可撤消最新的操作; + CaretIndex:获取或设置插入符号的插入位置索引。 + FlowDirection:获取或设置文本和其他用户界面 (UI) 元素在控制其布局的任何父元素内流动的方向。 + FontFamily:字体样式; FontSize:字体大小; FontStretch:字体在屏幕上紧缩或加宽的程度。 + HorizontalAlignment/VerticalAlignment:获取或设置在父元素中组合此元素时所应用的水平对齐特征/垂直对齐特征。 + HorizontalContentAlignment/VerticalContentAlignment:获取或设置控件内容的水平对齐方式/垂直对齐方式。 + HorizontalScrollBarVisibility/VerticalScrollBarVisibility:是否显示水平滚动条/垂直滚动条; + HorizontalOffset/VerticalOffset:获取和设置水平滚动条的位置/垂直滚动条的位置; + IsEnabled:使能,是否可用; IsReadOnly:对用户而言是否只读; + IsUndoEnabled:是否支持撤销功能; LineCount:文本总行数; + MaxLength:在文本框中手动输入的最大字符数。 + MaxLines/MinLines:最大可见行数/最小行数。 + Name:元素标识名称; Opacity:透明度; + SelectedText:文本框中当前选择的内容。 + SelectionBrush:突出显示选定文本的画笔。 + SelectionLength:文本框中当前选择的字符数。 + SelectionOpacity:选择文本的透明度。 + SelectionStart:当前选择的起始位置的字符索引。 + SelectionTextBrush:选中文本的颜色; + Text:文本框的文本内容。 + TextAlignment:文本框内容的水平对齐方式。 + TextWrapping:文本框中文本的换行方式。 + +4、ListBox 是一个 ItemsControl,这意味着它可以包含任何类型的对象的集合 (,例如字符串、图像或面板) 。 + 一个 ListBox 中的多个项是可见的,与仅 ComboBox具有所选项可见的项不同,除非 IsDropDownOpen 属性为 true。 该 SelectionMode 属性确定一次是否可以选择多个项 ListBox 。 +常用属性介绍 + FontFamily:字体系列; FontSize:字体大小; FontStretch:字体在屏幕上紧缩或加宽的程度;FontWeight:字体粗细; + Background:背景; BorderBrush:边框颜色; BorderThickness:边框宽度; Foreground:前景色; + Width/Height:宽度/高度; Name:元素标识名称; IsEnabled:使能,是否可用; Margin:外边距; + Opacity:透明度; Visibility:可见性; IsVisible:是否可见; FlowDirection:其子元素的流动方向; + LayoutTransform:在执行布局时应该应用于此元素的图形转换方式。 RenderTransform:元素的呈现位置的转换信息; + RenderTransformOrigin:由RenderTransform声明的任何可能呈现转换的中心点,相对于元素的边界。 + HorizontalAlignment/VerticalAlignment:在父元素中组合此元素时所应用的水平对齐特征/垂直对齐特征。 + HorizontalContentAlignment/VerticalContentAlignment:控件内容的水平对齐方式/垂直对齐方式。 + Items:获取用于生成 ItemsControl 的内容的集合。 + ItemsSource:获取或设置用于生成 ItemsControl 的内容的集合。 + SelectedIndex:获取或设置当前选择中第一项的索引,如果选择为空,则返回负一(-1)。 + SelectedItem:获取或设置当前选择中的第一项,或者,如果选择为空,则返回 null。 + SelectedItems:获取当前选定的项。 + SelectedValue:获取或设置通过使用 SelectedItem 而获取的 SelectedValuePath 的值。 + SelectedValuePath:获取或设置用于从 SelectedValue 获取 SelectedItem 的路径。 + SelectionMode:获取或设置 ListBox 的选择行为。 + SnapsToDevicePixels:获取或设置一个值,该值确定在呈现过程中,此元素的呈现是否应使用特定于设备的像素设置。 + +5、DataGrid DataGrid 表示用于在可自定义的网格中显示数据的控件。 + 常用属性介绍 + ActualHeight/ActualWidth:元素呈现的高度/宽度。 + CanSelectMultipleItems:获取或设置一个值,该值指示是否可以一次选择 MultiSelector 中的多个项。 + CanUserAddRows:获取或设置一个值,该值指示用户是否可在 DataGrid 中添加新行。 + CanUserDeleteRows:获取或设置一个值,该值指示用户是否可从 DataGrid 中删除行。 + CanUserReorderColumns:获取或设置一个值,该值指示用户能否通过用鼠标拖动列标题来更改列的显示顺序。 + CanUserResizeColumns/CanUserResizeRows:获取或设置一个值,该值指示用户是否可使用鼠标调整列宽/高度。 + CanUserSortColumns:获取或设置一个值,该值指示用户能否通过单击列标题对列进行排序。 + ColumnHeaderHeight:获取或设置列标题行的高度。 + Columns:获取一个集合,该集合包含 DataGrid 中的所有列。 + ColumnWidth:获取或设置 DataGrid 中列和标题的标准宽度和大小调整模式。 + CurrentCell:获取或设置具有焦点的单元格。CurrentColumn:获取或设置包含当前单元格的列。 + CurrentItem:获取与包含当前单元格的行绑定的数据项。 + DisplayMemberPath:获取或设置源对象上的值的路径,以用作对象的可视表示形式。 + HeadersVisibility:获取或设置用于指定行和列标题可见性的值。 + HorizontalGridLinesBrush:获取或设置用于绘制水平网格线的画笔。 + HorizontalScrollBarVisibility/VerticalScrollBarVisibility:水平/垂直滚动条可见性。 + RowBackground:获取或设置行背景的默认画笔。RowHeaderWidth:获取或设置行标题列的宽度。 + RowHeight:获取或设置所有行的建议高度。SelectedCells:获取当前选定单元格的列表。 + SelectedIndex:获取或设置当前选择中第一项的索引,如果选择为空,则返回负一(-1)。 + SelectedItem:获取或设置当前选择中的第一项,或者,如果选择为空,则返回 null。 + SelectedItems:获取在 MultiSelector 中选定的项。 + SelectedValue:获取或设置通过使用 SelectedItem 而获取的 SelectedValuePath 的值。 + SelectedValuePath:获取或设置用于从 SelectedValue 获取 SelectedItem 的路径。 + SelectionMode:获取或设置一个值,该值指示如何在 DataGrid 中选择行和单元格。 + SelectionUnit:获取或设置一个值,该值指示是否可以在 DataGrid 中选择行、单元格或两者。 + Items:获取用于生成 ItemsControl 的内容的集合。ItemTemplate:获取或设置用来显示每个项的 DataTemplate。 + ItemsPanel:获取或设置模板,该模板定义对项的布局进行控制的面板。 + ItemsSource:获取或设置用于生成 ItemsControl 的内容的集合。 + SnapsToDevicePixels:获取或设置一个值,该值确定在呈现过程中,此元素的呈现是否应使用特定于设备的像素设置。 + +6、 ComboBox 表示带有下拉列表的选择控件,通过单击控件上的箭头可显示或隐藏下拉列表。也叫下拉列表控件。 +常用属性介绍 + FontFamily:字体系列; FontSize:字体大小; FontStretch:字体在屏幕上紧缩或加宽的程度;FontWeight:字体粗细; + Background:背景; BorderBrush:边框颜色; BorderThickness:边框宽度; Foreground:前景色; + Width/Height:宽度/高度; Name:元素标识名称; IsEnabled:使能,是否可用; Margin:外边距; + Opacity:透明度; Visibility:可见性; IsVisible:是否可见; FlowDirection:其子元素的流动方向; + LayoutTransform:在执行布局时应该应用于此元素的图形转换方式。 RenderTransform:元素的呈现位置的转换信息; + RenderTransformOrigin:由RenderTransform声明的任何可能呈现转换的中心点,相对于元素的边界。 + HorizontalAlignment/VerticalAlignment:在父元素中组合此元素时所应用的水平对齐特征/垂直对齐特征。 + HorizontalContentAlignment/VerticalContentAlignment:控件内容的水平对齐方式/垂直对齐方式。 + Items:获取用于生成 ItemsControl 的内容的集合。ItemTemplate:获取或设置用来显示每个项的 DataTemplate。 + ItemsPanel:获取或设置模板,该模板定义对项的布局进行控制的面板。 + ItemsSource:获取或设置用于生成 ItemsControl 的内容的集合。 + SelectedIndex:获取或设置当前选择中第一项的索引,如果选择为空,则返回负一(-1)。 + SelectedItem:获取或设置当前选择中的第一项,或者,如果选择为空,则返回 null。 + SelectedItems:获取当前选定的项。 Text:获取或设置当前选定项的文本。 + SelectedValue:获取或设置通过使用 SelectedItem 而获取的 SelectedValuePath 的值。 + SelectedValuePath:获取或设置用于从 SelectedValue 获取 SelectedItem 的路径。 + SelectionBoxItem:获取在选择框中显示的项。SelectionBoxItemTemplate:获取选择框内容的项模板。 + SnapsToDevicePixels:获取或设置一个值,该值确定在呈现过程中,此元素的呈现是否应使用特定于设备的像素设置。 + IsDropDownOpen:获取或设置一个值,该值指示组合框的下拉部分当前是否打开。 + IsEditable:获取或设置一个值,该值指示启用或禁用 ComboBox 的文本框中的文本编辑。 + IsReadOnly:获取或设置启用仅限选择模式的值,在此模式中,可选择但不可编辑组合框中的内容。 + + 示例: + 在MFC项目创建WPF用户控件 + using namespace System; +using namespace System::Windows; +using namespace System::Windows::Interop; +using namespace WpfControlLib; + +void CMFCPlaceholderDlg::OnBnClickedButtonLoadWPF() +{ + // TODO: 在此添加控件通知处理程序代码 + CRect rect; + GetDlgItem(IDC_STATIC_PLACEHOLDER)->GetClientRect(&rect); + + HwndSourceParameters^ sourceParams = gcnew HwndSourceParameters(gcnew String("WPFWnd")); + sourceParams->PositionX = Int32(rect.left); + sourceParams->PositionY = Int32(rect.top); + sourceParams->Width = Int32(rect.Width()); + sourceParams->Height = Int32(rect.Height()); + sourceParams->ParentWindow = System::IntPtr(GetDlgItem(IDC_STATIC_PLACEHOLDER)->GetSafeHwnd()); + sourceParams->WindowStyle = WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN; + + HwndSource^ source = gcnew HwndSource(*sourceParams); + if (source != nullptr) + { + UserControl1^ uc = gcnew UserControl1(); + source->RootVisual = uc; + } +} + +效果如图 +![img](https://gitee.com/biediaotoufa/windows/commit/dc4ac45bf2a8d0e514a12aec04a2407231573455) + +# 三、实验准备 + +1. 安装Windows11 Professional Edition,校园网有正版下载。 +2. 安装Office 中的 Word 和 Excel,安装专业增强版2021 +3. 另必须安装 Visual Studio 2022 Community, 并且安装 git,根据PPT内容安装VS相关扩展。 +4. -申请好 gitee 和github 账号,同时Visual Studio 也注册账号。在github及gitee上各建立一个空仓库。 +5. 学会建立 SSH 连接及推送到远程仓库的方法。 + + +# 四、(选做)搭建VS下python调试环境及机器学习平台pytorch,尝试gym + +### 1、搭建VS下的python调试环境 + +##### 在Visual Studio Installer中添加python开发 + +![img](https://gitee.com/biediaotoufa/windows/commit/8aa66060a2b161d85a9e003c41aa211dc5948400) + +### 2.搭建机器学习平台PyTorch + +##### 1.查看显卡配置 + +![img](https://gitee.com/biediaotoufa/windows/blob/master/PY6NUA%7DD1TQ$RU17YOP5GMO.png) + +##### 2.下载显卡驱动 + +##### 3.查看GPU状态 + +C:\Users\Ruoan>nvidia-smi +Fri Oct 21 18:26:56 2022 ++-----------------------------------------------------------------------------+ +| NVIDIA-SMI 451.67 Driver Version: 451.67 CUDA Version: 11.0 | +|-------------------------------+----------------------+----------------------+ +| GPU Name TCC/WDDM | Bus-Id Disp.A | Volatile Uncorr. ECC | +| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | +|===============================+======================+======================| +| 0 GeForce RTX 2060 WDDM | 00000000:01:00.0 On | N/A | +| N/A 58C P8 10W / N/A | 2175MiB / 6144MiB | 18% Default | ++-------------------------------+----------------------+----------------------+ + ++-----------------------------------------------------------------------------+ +| Processes: | +| GPU GI CI PID Type Process name GPU Memory | +| ID ID Usage | +|=============================================================================| +| 0 N/A N/A 1436 C+G Insufficient Permissions N/A | +| 0 N/A N/A 3808 C+G ...s\Win64\EpicWebHelper.exe N/A | +| 0 N/A N/A 4188 C+G ...cw5n1h2txyewy\LockApp.exe N/A | +| 0 N/A N/A 7636 C+G ...5n1h2txyewy\SearchApp.exe N/A | +| 0 N/A N/A 8360 C+G ...disk\baidunetdiskhost.exe N/A | +| 0 N/A N/A 8512 C+G C:\Windows\explorer.exe N/A | +| 0 N/A N/A 9636 C+G ..._dt26b99r8h8gj\RtkUWP.exe N/A | +| 0 N/A N/A 10132 C+G ...n64\EpicGamesLauncher.exe N/A | +| 0 N/A N/A 10668 C+G ...y\ShellExperienceHost.exe N/A | +| 0 N/A N/A 10908 C+G ...sk\baidunetdiskrender.exe N/A | +| 0 N/A N/A 11852 C+G ...2txyewy\TextInputHost.exe N/A | +| 0 N/A N/A 12204 C+G ...lPanel\SystemSettings.exe N/A | +| 0 N/A N/A 12372 C+G D:\鼠标\ClickShow.exe N/A | +| 0 N/A N/A 12600 C+G ...bbwe\Microsoft.Photos.exe N/A | +| 0 N/A N/A 13208 C+G ...er_engine\wallpaper32.exe N/A | +| 0 N/A N/A 13468 C+G ...6bftszj\TranslucentTB.exe N/A | +| 0 N/A N/A 16308 C+G ...wekyb3d8bbwe\Video.UI.exe N/A | +| 0 N/A N/A 38872 C+G ...tracted\WechatBrowser.exe N/A | +| 0 N/A N/A 47944 C+G ...d\runtime\WeChatAppEx.exe N/A | +| 0 N/A N/A 48976 C+G ...ub.ThreadedWaitDialog.exe N/A | +| 0 N/A N/A 51516 C+G ...ub.ThreadedWaitDialog.exe N/A | +| 0 N/A N/A 54976 C+G ...370.47\msedgewebview2.exe N/A | +| 0 N/A N/A 60100 C+G ...DE\Common7\IDE\devenv.exe N/A | +| 0 N/A N/A 63388 C+G Insufficient Permissions N/A | +| 0 N/A N/A 65360 C+G ...370.47\msedgewebview2.exe N/A | +| 0 N/A N/A 67540 C+G ...icrosoft VS Code\Code.exe N/A | +| 0 N/A N/A 69988 C+G ...ge\Application\msedge.exe N/A | +| 0 N/A N/A 89900 C+G ...tudio\Installer\setup.exe N/A | ++-----------------------------------------------------------------------------+ + + +##### 4、安装CUDA并配置环境变量 + +对照“NVIDIA控制面板”自己电脑GPU的版本,看是否满足需要装的CUDA版本对驱动的要求,然后去官网找合适的版本下载。 +随后在环境变量中手动添加路径。 + +##### 5、CUDNN + +找一个适合自己安装的CUDA版本的cudnn,单击它,然后选择“for Windows10”,单击下载就行。 + +##### 6、Anaconda +python只是一个编程语言,在开发具体软件时,可能还需要使用到各种的包,比如著名的 numpy,torch 等等。如果我们自己来管理则显得非常麻烦,于是便有了Anaconda这样一个类似容器的东西,它封装了python各种各样的包;同时它也可以提供一个不同的python语言版本。是非常利于 python 编程的。 +官网下载 anaconda 软件,然后安装即可。 +安装完成之后,在命令行输入python,能进入交互页面就说明没有问题了。 + +##### 7、安装PyTorch + +step 1.首先确定自己的电脑是否支持GPU加速。pytorch分成CPU和GPU两个版本,其中GPU版本仅支持N卡【Nvidia 显卡】的使用【对N卡的操作的接口就是cuda】。如果支持,则还需要验证自己的显卡算力如何,低算力是不能用较高版本的cuda的,否则启用cuda会失败;同时判断显卡的驱动版本,是否支持cuda。 +step 2.进入pytorch 官网,针对自己的平台安装pytorch。官网首页给出的几乎都是最新版,所以我们要去到之前的发布页找到合适的版本。 + +##### 8、检查PyTorch是否成功安装 + +输入如下代码显示true表示成功安装 +![img](https://gitee.com/biediaotoufa/windows/blob/master/%7DHLMH@R9D6YI%7D9%25%60(ZEODLM.png) + +### 3、安装gym + +1. 管理员运行进入 anaconda +2. git clone https://github.com/openai/gym.git +3. 进入下载好的 gym 文件夹 +4. 激活环境 conda activate env_pytorch +5. pip install gym \ + 此时立刻运行 pip install gym[Box2d] 会报错 +6. conda install swig +7. pip install gym[Box2d] + + + + + + + + + + + diff --git a/lab2_7.md b/lab2_7.md new file mode 100644 index 0000000000000000000000000000000000000000..89d5e2d838ffc5f77fbc3664a316dc5d81e563f7 --- /dev/null +++ b/lab2_7.md @@ -0,0 +1,61 @@ +# 注册表结构和类型 + +## 1 结构 + +包含关于一个注册表值的信息。列表中的 RegQueryMultipleValues 函数使用此结构。 + +```cpp +typedef struct value_entW { + LPWSTR ve_valuename; + DWORD ve_valuelen; + DWORD_PTR ve_valueptr; + DWORD ve_type; +} VALENTW, *PVALENTW; +``` + +**ve_valuename** +要检索的值的名称。请确保在调用 RegQueryMultipleValues 之前设置此成员,然后再调用 RegQueryMultipleValues。 + +**ve_valuelen** +ve_valueptr 所指向的数据的大小,以字节为单位。 + +**ve_valueptr** +一个指向值输入数据的指针。这是一个指针,指向在 lpValueBuf 缓冲区中返回的值的数据的指针,由 RegQueryMultipleValues 填写的缓冲区中的值的指针。 + +**ve_type** +ve_valueptr 所指向的数据类型。关于可能的类型列表可能的类型,需查看注册表值类型。 + +## 2 值的类型 + +下面的例子是遍历一个 REG_MULTI_SZ 字符串。 + +```cpp +#include +#include +#include + +void SampleSzz(PTSTR pszz) +{ + _tprintf(_TEXT("\tBegin multi-sz string\n")); + while (*pszz) + { + _tprintf(_TEXT("\t\t%s\n"), pszz); + pszz = pszz + _tcslen(pszz) + 1; + } + _tprintf(_TEXT("\tEnd multi-sz\n")); +} + +int __cdecl main(int argc, char **argv) +{ + // Because the compiler adds a \0 at the end of quoted strings, + // there are two \0 terminators at the end. + + _tprintf(_TEXT("Conventional multi-sz string:\n")); + SampleSzz(_TEXT("String1\0String2\0String3\0LastString\0")); + + _tprintf(_TEXT("\nTest case with no strings:\n")); + SampleSzz(_TEXT("")); + + return 0; +} +``` \ No newline at end of file diff --git a/lab2_8.md b/lab2_8.md new file mode 100644 index 0000000000000000000000000000000000000000..0594d6fd047c717b49060b4747ad68771bd2f028 --- /dev/null +++ b/lab2_8.md @@ -0,0 +1,115 @@ +# 枚举注册表子键 + +## 此实验示例使用RegQueryInfoKey、RegEnumKeyEx和RegEnumValue函数枚举指定键的子键。传递给每个函数的hKey参数是打开键的句柄。此键必须在函数调用之前打开,然后关闭。 +```cpp +// QueryKey - 枚举键的子键及其相关值。 +// hKey - 要列举其子键和值的键。 + +#include +#include +#include + +#define MAX_KEY_LENGTH 255 +#define MAX_VALUE_NAME 16383 + +void QueryKey(HKEY hKey) +{ + TCHAR achKey[MAX_KEY_LENGTH]; // 子键名称的缓冲区 + DWORD cbName; // 名称字符串的大小 + TCHAR achClass[MAX_PATH] = TEXT(""); // 类名的缓冲区 + DWORD cchClassName = MAX_PATH; // 类字符串的大小 + DWORD cSubKeys=0; // 子密钥的数量 + DWORD cbMaxSubKey; // 最大的子键尺寸 + DWORD cchMaxClass; // 最长级别的字符串 + DWORD cValues; // 键值的数量 + DWORD cchMaxValue; // 最长的值名称 + DWORD cbMaxValueData; // 最长值数据 + DWORD cbSecurityDescriptor; // 安全描述符的大小 + FILETIME ftLastWriteTime; // 最后写入时间 + + DWORD i, retCode; + + TCHAR achValue[MAX_VALUE_NAME]; + DWORD cchValue = MAX_VALUE_NAME; + + // 获取类的名称和值的数量。 + retCode = RegQueryInfoKey( + hKey, // 钥匙柄 + achClass, // 类名的缓冲区 + &cchClassName, // 类字符串的大小 + NULL, // 保留 + &cSubKeys, // 子密钥的数量 + &cbMaxSubKey, // 最长的子键尺寸 + &cchMaxClass, // 最长级别的字符串 + &cValues, // 这个键的值的数量 + &cchMaxValue, // 最长的值名称 + &cbMaxValueData, // 最长值数据 + &cbSecurityDescriptor, //安全描述符 + &ftLastWriteTime); // 最后写作时间 + + //枚举子键,直到RegEnumKeyEx失败。 + + if (cSubKeys) + { + printf( "\nNumber of subkeys: %d\n", cSubKeys); + + for (i=0; i