📄 7.3 效能监视.htm
字号:
size=2>为了使这两个处理程序可以互相通讯,CperfData使用一个安全性描述子来建立它的内部核心物件,以允许Everyone的GENERIC_ALL存取权限。依据您的需求,您可能会想改变此描述子,但是我认为大部份的开发者会觉得它已足够。</FONT></P>
<HR style="LINE-HEIGHT: 25px">
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>一旦效能资料已被启动,_tWinMain便会为它的其中一个物件新增实例。只要呼叫AddInstance即可新增实例:</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">INSTID CPerfData::AddInstance(BOOL fIgnoreIfExists, OBJID ObjId, <BR> PCTSTR pszInstName, OBJID ObjIdParent = 0, INSTID InstIdParent = 0);</PRE></FONT></DIV>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>fIgnoreIfExists参数会告诉函数如果一个指定的实例名称已经存在时,是否还要新增此实例。ObjId参数是确认取得新的实例之物件的程序设计符号。pszInstName参数是实例的字串名称。最后二个参数允许您指示哪一个实例是另一个物件实例的子实例。多数的实例没有父实例,所以您通常只会传递前叁个参数给此函数。如果函数执行成功,它会回传一个INSTID。这是我自己的资料型别,它是对处理新建立实例的handle。如果此函数执行失败,会回传
.1。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>CperfData类别有另一个AddInstance版本:</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">INSTID CPerfData::AddInstance(BOOL fIgnoreIfExists, OBJID ObjId, <BR> LONG lUniqueId, OBJID ObjIdParent = 0, INSTID InstIdParent = 0);</PRE></FONT></DIV>
<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>因为实例就和您的应用程序在执行时一样,可以有许多的变化,所以您应该在任何时间随意的新增新的实例。您也可以呼叫RemoveInstance以移除实例:</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::RemoveInstance(OBJID ObjId, INSTID InstId);</PRE></FONT></DIV>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>现在我们取得了一个有趣的教材—改变一个计数器的值。有二个存在的函数允许您去改变一个计数器的值:</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">LONG& CPerfData::GetCtr32(CTRID CtrId, int nInstId = 0) const; <BR>__int64& CPerfData::GetCtr64(CTRID CtrId, int nInstId = 0) const;</PRE></FONT></DIV>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>如果您想修改的计数器值有32位元,请呼叫GetCtr32;如果计数器值为64位元,则呼叫GetCtr64。在侦错阶段,如果您执行了一个不适当的呼叫,原始码会产生一个判断提示(Assertion)。对这二个函数,您必须为您定义的计数器传递程序设计符号。如果此计数器存在一个不支援实例的物件中,可以忽略第二个参数。如果此计数器被包含在一个支援实例的物件中,您就必须传递INSTID(被AddInstance回传)给第二个参数。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>这些函数不是回传一个LONG就是 __int64的参考值,用来确认在被分享的内存区块中的计数器值。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>用此参考值改变一个计数器值是一件微不足道的事。以下是一个范例:</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">LONG& lCounterValue = g_PerfData.GetCtr32(SOME_COUNTER_SYMBOL); <BR>lCounterValue = 5; // 建立计数器值为5 <BR>lCounterValue++; // 计数器值增加1 <BR>lCounterValue *= 13; // 将计数器值乘13</PRE></FONT></DIV>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>有更简单的方法!如果您想要改变计数器的值,只要在应用程序的原始程序代码中加入刚刚所提的那些程序代码即可。这几行程序代码可以非常快的执行,而且应该不会影响到您的应用程序之执行效能。</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">HWInputMon.cpp <BR>/******************************************************************** <BR>模组:HWInputMon.cpp <BR>通告:Copyright (c)2000 Jeffrey Richter <BR>********************************************************************/ <BR>#include "..\CmnHdr.h" // 请参阅附录A <BR>#include <WindowsX.h> <BR>#define HWINPUTPERFDATAMAP_IMPL <BR>#include "HWInputPerfDataMap.h" <BR>/////////////////////////////////////////////////////////////////////////////// <BR>LRESULT CALLBACK LowLevelKeyboardProc(int nCode, <BR> WPARAM wParam, LPARAM lParam){ <BR> if (nCode == HC_ACTION){ <BR> switch (wParam){ <BR> case WM_KEYDOWN: case WM_SYSKEYDOWN: <BR> case WM_KEYUP: case WM_SYSKEYUP: <BR> g_PerfData.GetCtr32(HWINPUT_KEYS)++; <BR> g_PerfData.GetCtr32(HWINPUT_KEYSPERSEC)++; <BR> break; <BR> } <BR> } <BR> return(CallNextHookEx(NULL, nCode, wParam, lParam)); <BR>} <BR>/////////////////////////////////////////////////////////////////////////////// <BR>typedef enum { <BR> mciFirst = 0, <BR> mciTotal = mciFirst, <BR> mciLeft, <BR> mciMiddle, <BR> mciRight, <BR> mciLast = mciRight <BR>}MOUSECLCKINST; <BR>CPerfData::INSTID g_MouseClckInstToPrfInstId [mciLast + 1]; <BR>/////////////////////////////////////////////////////////////////////////////// <BR>LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam){ <BR> if (nCode == HC_ACTION){ <BR> if (wParam == WM_MOUSEMOVE){ <BR> g_PerfData.GetCtr32(HWINPUT_MOUSEMOVES)++; <BR> g_PerfData.GetCtr32(HWINPUT_MOUSEMOVESPERSEC)++; <BR> } <BR> BOOL fDown = ((wParam == WM_LBUTTONDOWN) || <BR> (wParam == WM_MBUTTONDOWN) || (wParam == WM_RBUTTONDOWN)); <BR> if (fDown){ <BR> MOUSECLCKINST mci = mciLeft; <BR> if ((wParam == WM_LBUTTONDOWN) || (wParam == WM_LBUTTONUP)) <BR> mci = mciLeft; <BR> if ((wParam == WM_MBUTTONDOWN) || (wParam == WM_MBUTTONUP)) <BR> mci = mciMiddle; <BR> if ((wParam == WM_RBUTTONDOWN) || (wParam == WM_RBUTTONUP)) <BR> mci = mciRight; <BR> g_PerfData.GetCtr32(MOUSECLCKS_CLICKS, <BR> g_MouseClckInstToPrfInstId[mciTotal])++; <BR> g_PerfData.GetCtr32(MOUSECLCKS_CLICKSPERSEC, <BR> g_MouseClckInstToPrfInstId[mciTotal])++; <BR> g_PerfData.GetCtr32(MOUSECLCKS_CLICKS, <BR> g_MouseClckInstToPrfInstId[mci])++; <BR> g_PerfData.GetCtr32(MOUSECLCKS_CLICKSPERSEC, <BR> g_MouseClckInstToPrfInstId[mci])++; <BR> } <BR> } <BR> return(CallNextHookEx(NULL, nCode, wParam, lParam)); <BR>} <BR>/////////////////////////////////////////////////////////////////////////////// <BR>int WINAPI _tWinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int){ <BR> static TCHAR szAppName[] == TEXT("Hardware Input Monitor"); <BR> if (MessageBox(NULL, <BR> TEXT("Install Performance Counter Data into Registry?"), <BR> szAppName, MB_YESNO) == IDYES){ <BR> TCHAR szPath[_MAX_PATH]; <BR> GetModuleFileName(hinstExe, szPath, chDIMOF(szPath)); <BR> lstrcpy(_tcsrchr(szPath, TEXT(’\\’)) + 1, <BR> TEXT("07 HWInputMonPerfInfo.dll")); <BR> g_PerfData.Install(szPath); <BR> } <BR> if (MessageBox(NULL, <BR> TEXT("Collect Performance Counter Data?"), <BR> szAppName, MB_YESNO) == IDYES){ <BR> g_PerfData.Activate(); <BR> // 加入四个Mouse Click Object Instances <BR> g_MouseClckInstToPrfInstId[mciTotal] == <BR> g_PerfData.AddInstance(TRUE, PERFOBJ_MOUSECLCKS, TEXT("_Total")); <BR> g_MouseClckInstToPrfInstId[mciLeft] == <BR> g_PerfData.AddInstance(TRUE, PERFOBJ_MOUSECLCKS, TEXT("Left")); <BR> g_MouseClckInstToPrfInstId[mciMiddle] == <BR> g_PerfData.AddInstance(TRUE, PERFOBJ_MOUSECLCKS, TEXT("Middle")); <BR> g_MouseClckInstToPrfInstId[mciRight] == <BR> g_PerfData.AddInstance(TRUE, PERFOBJ_MOUSECLCKS, TEXT("Right")); <BR> // 安装低阶键盘和滑鼠的拦截程序(Hook) <BR> HHOOK hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL, <BR> LowLevelKeyboardProc, hinstExe, 0); <BR> HHOOK hhkLowLevelMouse = SetWindowsHookEx(WH_MOUSE_LL, <BR> LowLevelMouseProc, hinstExe, 0); <BR> // 保持此应用程序为执行状态,直到我们通知它停止为止 <BR> int x = IDRETRY; <BR> while (x == IDRETRY){ <BR> if (x == IDRETRY){ <BR> // 重新设定所有计数器为0 <BR> g_PerfData.LockCtrs(); <BR> g_PerfData.GetCtr32(HWINPUT_KEYS) = 0; <BR> g_PerfData.GetCtr32(HWINPUT_KEYSPERSEC) = 0; <BR> g_PerfData.GetCtr32(HWINPUT_MOUSEMOVES) = 0; <BR> g_PerfData.GetCtr32(HWINPUT_MOUSEMOVESPERSEC) = 0; <BR> MOUSECLCKINST mci = mciFirst; <BR> while (mci <= mciLast){ <BR> g_PerfData.GetCtr32(MOUSECLCKS_CLICKS, <BR> g_MouseClckInstToPrfInstId[mci]) = 0; <BR> g_PerfData.GetCtr32(MOUSECLCKS_CLICKSPERSEC, <BR> g_MouseClckInstToPrfInstId[mci]) = 0; <BR> mci = (MOUSECLCKINST) ((int) mci + 1); <BR> } <BR> g_PerfData.UnlockCtrs(); <BR> } <BR> x = MessageBox(NULL, <BR> TEXT("Click \"Retry\" to reset the counters..\n") <BR> TEXT("Click \"Cancel\" to terminate the application."), <BR> szAppName, MB_RETRYCANCEL); <BR> } <BR> UnhookWindowsHookEx(hhkLowLevelKybd); <BR> UnhookWindowsHookEx(hhkLowLevelMouse); <BR> // 移除四个Mouse Click Object Instances <BR> g_PerfData.RemoveInstance(PERFOBJ_MOUSECLCKS, <BR> g_MouseClckInstToPrfInstId[mciTotal]); <BR> g_PerfData.RemoveInstance(PERFOBJ_MOUSECLCKS, <BR> g_MouseClckInstToPrfInstId[mciLeft]); <BR> g_PerfData.RemoveInstance(PERFOBJ_MOUSECLCKS, <BR> g_MouseClckInstToPrfInstId[mciMiddle]); <BR> g_PerfData.RemoveInstance(PERFOBJ_MOUSECLCKS, <BR> g_MouseClckInstToPrfInstId[mciRight]); <BR> } <BR> if (MessageBox(NULL, <BR> TEXT("Remove Performance Counter Data from the Registry?"), <BR> szAppName, MB_YESNO) == IDYES){ <BR> g_PerfData.Uninstall(); <BR> } <BR> return(0); <BR>} <BR>/////////////////////////////////End Of File /////////////////////////////////</PRE></FONT></DIV>
<CENTER style="LINE-HEIGHT: 25px">
<P></P>
<P class=content_page><A
href="http://www.acejoy.com/Html/Article/network/5820061017123258_P2.html">上一页</A> <A
href="http://www.acejoy.com/Html/Article/network/5820061017123258.html">[1]</A> <A
href="http://www.acejoy.com/Html/Article/network/5820061017123258_P2.html">[2]</A> <STRONG><FONT
color=#ff0033>[3]</FONT></STRONG> <A
href="http://www.acejoy.com/Html/Article/network/5820061017123258_P4.html">[4]</A> <A
href="http://www.acejoy.com/Html/Article/network/5820061017123258_P5.html">[5]</A> <A
href="http://www.acejoy.com/Html/Article/network/5820061017123258_P4.html">下一页</A></P></DIV><BR><BR></CENTER></TD></TR></TBODY></TABLE>
<TABLE style="CLEAR: both" cellSpacing=0 cellPadding=0 width="97%">
<TBODY>
<TR>
<TD align=right>
<TABLE>
<TBODY>
<TR>
<TD>阅读:<SPAN id=news_hits></SPAN>
<SCRIPT src="7.3 效能监视.files/GetHits.htm"
type=text/JavaScript></SCRIPT>
次<BR>录入:<A
href="http://www.acejoy.com/User/Info.Asp?UserName=admin">admin</A><BR><BR></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD align=right>【 <A
href="http://www.acejoy.com/Comment.asp?ChannelID=1&Action=Write&InfoID=58">评论</A>
】 【 <A
href="http://www.acejoy.com/User/SendMail.asp?Title=Windows2000 服务器端应用程序开发设计指南-效能监视"
target=_blank>推荐</A> 】 【 <A href="javascript:window.print()">打印</A>
】 </TD></TR></TBODY></TABLE>
<TABLE style="CLEAR: both" width="97%" align=center>
<TBODY>
<TR>
<TD>上一篇:<A
title="标题:Windows2000 服务器端应用程序开发设计指南-事件记录 作者:Jeffrey Richter Jason D. Clark 更新:2006-10-13 21:40:03 点击:986"
href="http://www.acejoy.com/Html/Article/network/5720061013214003.html">Windows2000
服务器端应用程序开发设计指南-事件记录</A><BR>下一篇:<A
title="标题:Windows2000 服务器端应用程序开发设计指南-Windows Management Instrumentation 作者:Jeffrey Richter Jason D. Clark 更新:2006-10-23 9:19:39 点击:761"
href="http://www.acejoy.com/Html/Article/network/5920061023091939.html">Windows2000
服务器端应用程序开发设计指南-Windows Management Instrumentation</A>
</TD></TR></TBODY></TABLE></TD>
<TD class=mr></TD></TR></TBODY></TABLE></DIV></DIV>
<DIV class=mframe>
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center>
<TBODY>
<TR>
<TD class=tl></TD>
<TD class=tm><SPAN class=tt>相关新闻</SPAN> </TD>
<TD class=tr></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center>
<TBODY>
<TR>
<TD class=ml></TD>
<TD class=mm>
<TABLE height="100%" cellSpacing=5 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top>
<SCRIPT language=javascript
src="7.3 效能监视.files/GetCorrelative.htm"></SCRIPT>
</TD></TR></TBODY></TABLE></TD>
<TD class=mr></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center>
<TBODY>
<TR>
<TD class=tl></TD>
<TD class=tm><SPAN class=tt>本文评论</SPAN> </TD>
<TD class=tr></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center>
<TBODY>
<TR>
<TD class=ml></TD>
<TD class=mm>
<P> </P>
<TABLE height="100%" cellSpacing=5 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top>
<SCRIPT language=javascript
src="7.3 效能监视.files/Comment.htm"></SCRIPT>
</TD></TR></TBODY></TABLE></TD>
<TD class=mr></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center>
<TBODY>
<TR>
<TD class=ml></TD>
<TD class=mm></TD>
<TD class=mr></TD></TR></TBODY></TABLE></DIV>
<TABLE id=footer cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR style="LINE-HEIGHT: 130%" align=middle>
<TD height=23> <A
href='javascript:window.external.addFavorite("http://www.acejoy.com","ACE开发者")'><FONT
color=#000000>加入收藏</FONT></A> - <A
href="http://www.acejoy.com/Help.asp?Action=aboutweb" target=_blank><FONT
color=#000000>关于本站</FONT></A> - <A class=Bottom
href="http://www.acejoy.com/Help.asp?Action=Copyright" target=_blank><FONT
color=#000000>版权申明</FONT></A> - <A class=Bottom
href="http://www.acejoy.com/Help.asp?Action=aboutweb" target=_blank><FONT
color=#000000>联系站长</FONT></A> - <A class=Bottom
href="http://www.acejoy.com/LinkSite.asp" target=_blank><FONT
color=#000000>友情链接</FONT></A> </TD></TR>
<TR align=middle>
<TD height=23>Copy
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -