Alternate e697dbe9c5997e35395fe158628dd8c5209481da
for Visual Studio 2022 and Windows 11.
読み取り中…
検索中…
一致する文字列を見つけられません
WatchDogTimerTest.cpp
[詳解]
1
5
6#include "pch.h"
7#include "WatchDogTimer.h"
8#include "Thread.h"
9#include "Binder.hpp"
10
11using namespace Microsoft::VisualStudio::CppUnitTestFramework;
12
13namespace WindowsLibraryTest
14{
15 TEST_CLASS (WatchDogTimerTest)
16 {
17 public:
18 TEST_CLASS_INITIALIZE (ClassInitialize)
19 {
20 Logger::WriteMessage ("WatchDogTimer class initialize.\n");
21 }
22
23 TEST_CLASS_CLEANUP (ClassCleanup)
24 {
25 Logger::WriteMessage ("WatchDogTimer class cleanup.\n");
26 }
27
28 TEST_METHOD_INITIALIZE (MethodInitialize)
29 {
30 Logger::WriteMessage ("WatchDogTimer method initialize.\n");
31 }
32
33 TEST_METHOD_CLEANUP (MethodCleanup)
34 {
35 Logger::WriteMessage ("WatchDogTimer method cleanup.\n");
36 }
37
38 class TimeupFunction : public alt::skeleton::ITimeup
39 {
40 public:
41 TimeupFunction ()
42 {
43 _dwPreviousTime = 0;
44 ZeroMemory (_tszMsg, sizeof (_tszMsg));
45 }
46
47 void Timeup (LPVOID me, DWORD dwHiTime, DWORD dwLoTime)
48 {
49 _stprintf_s (_tszMsg, _T ("--TimeupFunction::Timeup() dwHiTime=%u diff=%u\n"), dwHiTime, dwHiTime - _dwPreviousTime);
50 Logger::WriteMessage (_tszMsg);
51 _dwPreviousTime = dwHiTime;
52 }
53
54 private:
55 DWORD _dwPreviousTime;
56 TCHAR _tszMsg[80];
57 };
58
59 TEST_METHOD (WatchDogTimer1)
60 {
61 const int count = 30;
62 const DWORD cdwTime = 20;
63
66 function.New ();
67 T.New (function.Get());
68
69 BOOL ret1 = T->InitTimer (_T ("WatchDogTimer1"));
70 Assert::IsTrue (ret1);
71
73
74 TCHAR tszMsg[80];
75 double dArray[count];
76 ZeroMemory (dArray, sizeof (dArray));
77
78 Logger::WriteMessage ("Timer Start.\n");
79 BOOL ret2 = T->StartTimer (cdwTime);
80 Assert::IsTrue (ret2);
81
82 int iCounter = count - 1;
83 while (true)
84 {
85 Q.Start ();
86 DWORD dwRet = T->WaitTimer ();
87 Q.Stop ();
88
89 if (dwRet == WAIT_OBJECT_0)
90 {
91 dArray[iCounter] = Q.PastTime ();
92 iCounter--;
93 if (iCounter < 0) break;
94 }
95 }
96
97 T->StopTimer ();
98
99 double minValue = cdwTime;
100 double maxValue = cdwTime;
101 double sum = 0;
102 double average = 0;
103 double sd = 0;
104
105 for (int i = 0; i < count; i++)
106 {
107 if (minValue > dArray[i]) minValue = dArray[i];
108 if (maxValue < dArray[i]) maxValue = dArray[i];
109 sum += dArray[i];
110 }
111 average = sum / count;
112
113 for (int i = 0; i < count; i++)
114 {
115 sd += pow (average - dArray[i], 2);
116 }
117 sd = pow (sd / count, 0.5);
118
119 _stprintf_s (tszMsg, _T ("interval=%d minValue=%.4f maxValue=%.4f average=%.4f sd=%.4f\n"), cdwTime, minValue, maxValue, average, sd);
120 Logger::WriteMessage (tszMsg);
121
122 int outband = 0;
123 for (int i = 0; i < count; i++)
124 {
125 double diff = dArray[i] - cdwTime;
126 if (diff < -0.9 || 0.9 < diff)
127 {
128 outband++;
129 _stprintf_s (tszMsg, _T ("i=%3d outband=%3d diff=%.4f\n"), i, outband, diff);
130 Logger::WriteMessage (tszMsg);
131 }
132
133 }
134
135 Logger::WriteMessage ("Timer Stopped.\n");
136 }
137
138 TEST_METHOD (WatchDogTimer2)
139 {
140 const int count = 30;
141 const DWORD cdwTime = 20;
142
144 T.New ();
145
146 BOOL ret1 = T->InitTimer (_T ("WatchDogTimer2"));
147 Assert::IsTrue (ret1);
148
150
151 TCHAR tszMsg[80];
152 double dArray[count];
153 ZeroMemory (dArray, sizeof (dArray));
154
155 Logger::WriteMessage ("Timer Start.\n");
156 BOOL ret2 = T->StartTimer (cdwTime);
157 Assert::IsTrue (ret2);
158
159 int iCounter = count;
160 while (iCounter--)
161 {
162 Q.Start ();
163 DWORD dwRet = T->WaitTimer ();
164 Q.Stop ();
165
166 if (dwRet == WAIT_OBJECT_0)
167 {
168 dArray[iCounter] = Q.PastTime ();
169 }
170 }
171
172 T->StopTimer ();
173
174 double minValue = cdwTime;
175 double maxValue = cdwTime;
176 double sum = 0;
177 double average = 0;
178 double sd = 0;
179
180 for (int i = 0; i < count; i++)
181 {
182 if (dArray[i] < minValue) minValue = dArray[i];
183 if (dArray[i] > maxValue) maxValue = dArray[i];
184 sum += dArray[i];
185 }
186 average = sum / count;
187
188 for (int i = 0; i < count; i++)
189 {
190 sd += pow (average - dArray[i], 2);
191 }
192 sd = pow (sd / count, 0.5);
193
194 _stprintf_s (tszMsg, _T ("interval=%d minValue=%.4f maxValue=%.4f average=%.4f sd=%.4f\n"), cdwTime, minValue, maxValue, average, sd);
195 Logger::WriteMessage (tszMsg);
196
197 int outband = 0;
198 for (int i = 0; i < count; i++)
199 {
200 double diff = dArray[i] - cdwTime;
201 if (diff < -0.9 || 0.9 < diff)
202 {
203 outband++;
204 _stprintf_s (tszMsg, _T ("i=%3d outband=%3d diff=%.4f\n"), i, outband, diff);
205 Logger::WriteMessage (tszMsg);
206 }
207
208 }
209
210 Logger::WriteMessage ("Timer Stopped.\n");
211 }
212 };
213}
newオブジェクトを管理するコンテナクラス
スレッドに関するWindowsAPIを集約したクラス
タイマーに関するWindowsAPIを集約したクラス
プリコンパイル済みヘッダー ファイルです。
高分解能時間計測クラス
VOID APIENTRY Start()
計測を開始します。
double APIENTRY PastTime() const
計測開始〜計測終了までの時間を出力します。
VOID APIENTRY Stop()
計測を終了します。
newオブジェクトを管理するコンテナクラス
Definition: Binder.hpp:18
T *APIENTRY Get() const
管理オブジェクトの取得
Definition: Binder.hpp:59
bool APIENTRY New(Args... args)
管理オブジェクトの作成
Definition: Binder.hpp:44
WatchDogTimerクラスのコールバック関数を設定します。
TEST_CLASS(ArrayTest)
Definition: ArrayTest.cpp:19