⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 7.3 效能监视.htm

📁 Windows2000后台服务程序开发手册
💻 HTM
📖 第 1 页 / 共 5 页
字号:
                  size=2>在DLL「<dll name>」中「<service 
                  name&gt;」服务开启程序被呼叫且回传成功执行。</FONT></TD></TR>
              <TR style="LINE-HEIGHT: 25px">
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>3001</FONT></TD>
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>一个被更新的效能计数器程序库文件已被侦测。「&lt;dll 
                  name&gt;」之效能计数器已被执行。</FONT></TD></TR></TBODY></TABLE></CENTER>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>您应注意到列在表7-6中的一些事件并没有对于时间的设定。例如,如果DLL的Open函数占用太久以致于无法返回,系统会假设效能计数器DLL产生错误,并产生一个识别码为2002的事件。在登录中设定OpenProcedureWaitTime值,以让系统知道在回报事件前应等待多久的时间。这个值与另外二个值(ExtCounterTestLevel和EventLogLevel)一样,被列在相同登录子机码下。此外,这个值也可让您设定Open函数所需之毫秒数。</FONT></P>
            <HR style="LINE-HEIGHT: 25px">

            <P><FONT style="LINE-HEIGHT: 25px" face=Arial color=#3e77d7 size=3 
            Black><B style="LINE-HEIGHT: 25px">说明</B></FONT> </P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>这个值只会影响系统应等待事件记录项目产生的时间。设定一个逾时时间并不会迫使系统丢弃Open函数而去做其他事。如果Open函数没有返回,要求效能资料之应用程序会停止执行。</FONT></P>
            <HR style="LINE-HEIGHT: 25px">

            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>一个单一的登录值被用在所有的Open函数上,每一个效能计数器DLL皆可以设定一个唯一的Collect函数函数逾时值。为了为DLL之Collect函数设定一个时间限制(毫秒),可以建立一个名称为Collect 
            Timeout的REG_DWORD登录值(在该名称之间必须有空白)。这个值必须被放置在以下的子机码之后:</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
            style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">HKEY_LOCAL_MACHINE \SYSTEM\CurrentControlSet\Services\ServiceName\Performance</PRE></FONT></DIV>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>再者,此子机码的ServiceName选项部份是您的服务或应用程序之执行资料之唯一识别的一部份。如果您的DLL之Collect函数没有在被指定的毫秒时间内返回,此时会产生一个识别码为1015的事件,并被加入系统的应用程序记录档中。</FONT></P></A><A 
            style="LINE-HEIGHT: 25px" name=207006>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e70d7 
            size=5><B style="LINE-HEIGHT: 25px">HWInputMon范例应用程序<BR 
            style="LINE-HEIGHT: 25px"> </B></FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>HWInputMon范例应用程序(「07 
            HWInputMon.exe」),显示在本节最后的列表7-1中,展示一个键之敲击以及滑鼠移动的效能资讯。包括一个简单的DLL(「07 
            HWInputMonPerfInfo.dll」)用来收集并回传效能资讯,显示在列表7-2中。此范例应用程序的原始程序代码以及DLL存放在随书光碟上的07-HWInputMon以及07-HWInputMonPerfInfo目录中。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>HWInputMon建立了一个名为Hardware Input的效能物件并显示了四个计数器: 
            Keystrokes、Keystrokes/sec、Mouse moves和Mouse 
            moves/sec,如图7-12所示。我强烈地建议您详细地了解此范例应用程序。</FONT></P>
            <P><BR style="LINE-HEIGHT: 25px"> </P>
            <CENTER style="LINE-HEIGHT: 25px">
            <P><INPUT id=12 style="LINE-HEIGHT: 25px" type=image height=442 
            width=610 src="7.3 效能监视.files/7-12.gif" border=0 
            &#111nclick="imgclick"></P></CENTER>
            <CENTER style="LINE-HEIGHT: 25px">
            <TABLE style="LINE-HEIGHT: 25px" border=0>
              <TBODY style="LINE-HEIGHT: 25px">
              <TR style="LINE-HEIGHT: 25px">
                <TD style="LINE-HEIGHT: 25px" align=middle><FONT 
                  style="LINE-HEIGHT: 25px" face=arial color=#000000 
                  size=2><FONT style="LINE-HEIGHT: 25px" face=arial 
                  color=#3e80d7 size=2><B 
                  style="LINE-HEIGHT: 25px">&nbsp;图7-12&nbsp;</B></FONT>HWInputMon范例应用程序之新增计数器对话方块</FONT></TD></TR></TBODY></TABLE></CENTER>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e72d7 
            size=4><B style="LINE-HEIGHT: 25px">CperfData类别<BR 
            style="LINE-HEIGHT: 25px"> </B></FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>为了简单地新增效能物件和计数器到HWInputMon中,我建立了一个C++ 
            类别,名称为CperfData。CperfData档(PerfData.h)和它的支援档(Optex.h以及RegKey.h)皆存放在随书光碟上。CperfData做了所有冗长及令人厌烦的工作,例如被分享的内存管理、资料结构初始化、建构内存区块、物件实例的新增和移除以及登录的管理。如果您在自己的应用程序或服务中使用CperfData类别,在您的程序代码中增加效能资讯的最困难部分将是决定该显示哪个物件和计数器。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>透过参考这个原始码的注解,对于了解详细的CperfData成员函数的部份应该不成问题。然而,为了要使用此类别来新增效能计数器至您应用程序,您不需要了解它内部的运作方式,只需知道如何设定此类别即可。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e74d7 
            size=3><B style="LINE-HEIGHT: 25px">使用CperfData类别<BR 
            style="LINE-HEIGHT: 25px"> </B></FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>为了建立一个显示效能资讯的服务(或应用程序),您将需要二个专案:一个可执行服务或应用程序之Win32应用程序专案以及一个收集与回传效能资讯的Win32 
            DLL专案。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>一旦建立了这二个专案后,必须建立一个对您想要应用程序显示之特定物件及计数器的定义符号标头档。如HWInputMon范例,此标头档的名称为HWInputPerfDataMap.h,如列表7-3中所示。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>您可以用PERFDATA_DEFINE_OBJECT巨集指令码(在PerfData.h中定义)来定义一个物件的符号。此巨集指令码有二个参数:一个您可以在应用程序中用来参考此物件的符号名称,以及一个您定义之识别码。您必须不重覆使用识别码数字,而识别码必须不为0。建立计数器的正确方式与上述的方式相同,只是此时应使用PERFDATA_DEFINE_COUNTER巨集指令码。任何须改变或更新一个效能监视的原始程序代码中必须包含此标头档。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>现在您会建立一个指示您的服务或应用程序支援的物件与计数器表格。为了方便说明,我也将此资讯包含在HWInputPerfDataMap.h中。使用宣告在PerfData.h标头档中的巨集指令码可使这个表格的建立变得非常容易。这些巨集指令码会建立一个被我呼叫之效能资料的对映。此对映与MFC程序设计所使用的讯息对映类似。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>为了建立一个效能资料对映,可从那些说明一个定义您的物件程计数器的结构阵列之PERFDATA_MAP_BEGIN巨集指令码开始。在此巨集指令码之后为一或多个PERFDATA_MAP_OBJ与PERFDATA_MAP_CTR巨集指令码。注意对映中的项目顺序是很重要的,由它的计数器跟随其后,并依此类推。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>为了宣告一个物件,必须使用PERFDATA_MAP_OBJ巨集指令码。此巨集指令码需要7个参数:</FONT></P><FONT 
            style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2>
            <OL style="LINE-HEIGHT: 25px">
              <LI style="LINE-HEIGHT: 25px">确认物件之程序设计符号。 
              <LI style="LINE-HEIGHT: 25px">物件的Unicode字串名称(它会被新增至登录中)。 
              <LI style="LINE-HEIGHT: 25px">物件的Unicode解说文字(它也会被新增至登录中)。 
              <LI style="LINE-HEIGHT: 25px">物件的细节层次。 
              <LI 
              style="LINE-HEIGHT: 25px">当物件在系统监控程序中被选择时,一个预设应被选择的计数器之程序设计符号名称。 
              <LI 
              style="LINE-HEIGHT: 25px">物件支援之实例的最大数字(如果物件不支援实例,则传递PERF_NO_INSTANCES)。 

              <LI style="LINE-HEIGHT: 25px">可以在实例字串名称中显示的最大字元数(如果物件不支援实例,则传递0)。 
              </LI></OL></FONT>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>在您加入一个物件至对映后,即可使用PERFDATA_MAP_CTR巨集指令码来为物件新增一或多个计数器。此巨集指令码需要6个参数:</FONT></P><FONT 
            style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2>
            <OL style="LINE-HEIGHT: 25px">
              <LI style="LINE-HEIGHT: 25px">确认计数器之程序设计符号。 
              <LI style="LINE-HEIGHT: 25px">计数器的Unicode字串名称(此名称会被新增至登录中)。 
              <LI style="LINE-HEIGHT: 25px">计数器的Unicode解说文字(也会被加至登录中)。 
              <LI style="LINE-HEIGHT: 25px">计数器的细节层次。 
              <LI style="LINE-HEIGHT: 25px">计数器的预设小数值。 
              <LI style="LINE-HEIGHT: 25px">计数器的类型。 </LI></OL></FONT>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>在您将所有的物件和计数器新增至对映后,即可使用PERFDATA_MAP_END巨集指令码来完成对应的设定。此巨集指令码只有一个参数—您的服务或应用程序名称—而且被用来在以下所示之登录机码中建立计数器资讯:</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
            style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ServiceName<BR> Performance</PRE></FONT></DIV>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>这个巨集指令码会终止对映并建立一个CperfData类别的全域实例。此全域实例的名称为g_PerfData,当您想要操作效能物件、实例或计数器时,在您的程序代码中将会需要参考此变数。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>注意到效能资料的对映都被它自己放置在一个原始程序代码文件中。因为应用程序和DLL在它们的专案中必须包含此档,所以这是必要的。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>让我们将注意力转移到一些说明如何正确地使用CperfData类别的公用成员函数上。先看位于HWInputMon.cpp中的_tWinMain函数(请参阅&nbsp;</FONT></A><FONT 
            style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2><A 
            style="LINE-HEIGHT: 25px" 
            href="http://www.acejoy.com/doc/serverside/7.htm#320-1" 
            target=_new>列表7-1</A>&nbsp;)。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>要适当的为应用程序显示效能资讯,登录必须依据本章前面所提的方式而设定。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>CperfData有一个静态成员函数,名称为Install:</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
            style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">void CPerfData::Install(PCWSTR pszDllPathname);</PRE></FONT></DIV>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>必须传递显示您的效能资讯之DLL路径名称给这个函数。在HWInputMon范例应用程序中,如果使用者在Install 
            Performance Counter Data Into 
            Registry讯息方块中按下了Yes按钮,那么_tWinMain便会呼叫此函数。为了决定DLL的完整路径名称,我用可执行档的完整路径名称并用DLL的文件名称来取代可执行档的名称—当然,假设可执行档和DLL档必须放在相同的目录中。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>要从系统的登录中移除效能计数器资讯,必须呼叫CperfData的Uninstal函数:</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
            style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">void CPerfData::Uninstall();</PRE></FONT></DIV>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>在_tWinMain中,如果使用者在Remove Performance CounterData From The 
            Registry讯息方块中按下Yes按钮,便呼叫此函数。当您正在对计数器做侦错的动作时,您也许会想使您的应用程序在关机期间在启动和移除功能表上安装这个登记资讯。使用此方法,如果您决定新增、删除或者移动任何在效能资料对映中的项目,登录将不会同时将它剔除。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>一旦登录完成设定以后,会呼叫CperfData类别的Activate方法以告诉CPerfData物件可以开始记录效能计数器的资讯:</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
            style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">DWORD CPerfData::Activate();</PRE></FONT></DIV>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>这个函数配置了被分享的内存区块并且将包含在效能资料对映中的资讯初始化。一个应用程序应该只有在效能资讯已被安装后才呼叫此函数。</FONT></P>
            <HR style="LINE-HEIGHT: 25px">

            <P><FONT style="LINE-HEIGHT: 25px" face=Arial color=#3e77d7 size=3 
            Black><B style="LINE-HEIGHT: 25px">说明</B></FONT> </P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>在CperfData类别内部使用了一个内存对应档之核心物件来实作此分享内存区块。内存对映档将服务的位址空间对映至也将被应用程序之位址空间要求的位址空间(例如,MMC.exe或WinLogon)。因为这两个处理程序在不同的安全性内容下可以执行得很好,所以必须采取此步骤,以使他们能够与使用此核心物件彼此通讯。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -