Alternate e697dbe9c5997e35395fe158628dd8c5209481da
for Visual Studio 2022 and Windows 11.
読み取り中…
検索中…
一致する文字列を見つけられません
ThreadTest.cpp
[詳解]
1
5
6#include "pch.h"
7#include "Thread.h"
8
9using namespace Microsoft::VisualStudio::CppUnitTestFramework;
10
11namespace WindowsLibraryTest
12{
13 TEST_CLASS (ThreadTest)
14 {
15 public:
16 TEST_CLASS_INITIALIZE (ClassInitialize)
17 {
18 Logger::WriteMessage ("ThreadTest class initialize.\n");
19 }
20
21 TEST_CLASS_CLEANUP (ClassCleanup)
22 {
23 Logger::WriteMessage ("ThreadTest class cleanup.\n");
24 }
25
26 TEST_METHOD_INITIALIZE (MethodInitialize)
27 {
28 Logger::WriteMessage ("ThreadTest method initialize.\n");
29 }
30
31 TEST_METHOD_CLEANUP (MethodCleanup)
32 {
33 Logger::WriteMessage ("ThreadTest method cleanup.\n");
34 }
35
36 class Callback : public alt::skeleton::ICallback
37 {
38 public:
39 DWORD Invoke (LPVOID lpvParam)
40 {
41 for (int i = 0; i < 10; i++)
42 {
43 Logger::WriteMessage (_T ("Invoke() working...\n"));
44 Sleep (20);
45 }
46
47 Logger::WriteMessage (_T ("Invoke() stopped.\n"));
48 return 0;
49 }
50 };
51
52 class MyThread : public alt::Thread, public alt::skeleton::ICallback
53 {
54 public:
55 MyThread () { _callback = this; };
56 ~MyThread () {};
57
58 DWORD Invoke (LPVOID lpvParam)
59 {
60 for (int i = 0; i < 10; i++)
61 {
62 Logger::WriteMessage (_T ("Invoke() working...\n"));
63 Sleep (20);
64 }
65
66 Logger::WriteMessage (_T ("Invoke() stopped.\n"));
67 return 0;
68 }
69 };
70
71 TEST_METHOD (ThreadTest1)
72 {
73 static int threadCounter = 0;
74
75 Callback* pCallback = new Callback ();
76 alt::Thread* pThread = new alt::Thread (pCallback);
77 BOOL ret1 = pThread->Create ();
78 Assert::IsTrue (ret1, _T("Thread::Create() failed.\n"));
79
80 for (int i = 0; i < 10; i++)
81 {
82 threadCounter++;
83 Logger::WriteMessage (_T ("ThreadTest1() working...\n"));
84 Sleep (30);
85 }
86
87 Logger::WriteMessage (_T ("ThreadTest1() stopped.\n"));
88
89 DWORD dwReason = pThread->Wait ();
90 Assert::AreEqual (WAIT_OBJECT_0, dwReason, _T("Thread::Wait() not return WAIT_OBJECT_0.\n"));
91 Assert::AreEqual (10, threadCounter, _T("Thread::Wait() invalid timing.\n"));
92
93 delete pThread;
94 delete pCallback;
95 }
96
97 TEST_METHOD (ThreadTest2)
98 {
99 static int threadCounter = 0;
100
101 auto pWorker = new MyThread ();
102 BOOL ret1 = pWorker->Create ();
103 Assert::IsTrue (ret1, _T("Thread::Create() failed.\n"));
104
105 for (int i = 0; i < 10; i++)
106 {
107 threadCounter++;
108 Logger::WriteMessage (_T ("."));
109 Sleep (30);
110 }
111
112 Logger::WriteMessage (_T ("ThreadTest2() stopped.\n"));
113
114 DWORD dwReason = pWorker->Wait ();
115 Assert::AreEqual (WAIT_OBJECT_0, dwReason, _T("Thread::Wait() not return WAIT_OBJECT_0.\n"));
116 Assert::AreEqual (10, threadCounter, _T("Thread::Wait() invalid timing.\n"));
117
118 delete pWorker;
119 }
120
121 TEST_METHOD (ThreadTest3)
122 {
123 alt::Thread* thread = new alt::Thread ();
124 static int threadCounter = 0;
125 auto function = [](LPVOID lpvParam)->DWORD
126 {
127 int* waitTime = (int*)lpvParam;
128
129 for (int i = 0; i < 10; i++)
130 {
131 threadCounter++;
132 Logger::WriteMessage (_T ("."));
133 Sleep (*waitTime);
134 }
135
136 Logger::WriteMessage (_T ("ThreadTest3() stopped.\n"));
137
138 return true;
139 };
140
141 LONGLONG waitTime = 30;
142 thread->Create (function, &waitTime);
143 thread->Wait ();
144
145 Assert::AreEqual (10, threadCounter, _T("Thread::Wait() invalid timing.\n"));
146
147 delete thread;
148 }
149
150#define size 20
151#define loop 20
152 TEST_METHOD (ThreadTest4)
153 {
154 static int threadCounter[size];
155 for (int i = 0; i < size; i++)
156 {
157 threadCounter[i] = 0;
158 }
159
160 auto function = [](LPVOID lpvParam)->DWORD
161 {
162 int* index = (int*)lpvParam;
163 TCHAR tszMsg[128];
164
165 for (int i = 0; i < loop; i++)
166 {
167 threadCounter[*index]++;
168 wsprintf (tszMsg, _T ("thread(%02d) count(%02d)\n"), *index, i);
169 Logger::WriteMessage (tszMsg);
170 Sleep (10);
171 }
172
173 Logger::WriteMessage (_T ("ThreadTest4() stopped.\n"));
174
175 return *index;
176 };
177
178 BOOL ret;
179 HANDLE hThreads[size];
180 int param[size];
181
182 alt::Thread* thread = new alt::Thread[size];
183 for (int i = 0; i < size; i++)
184 {
185 param[i] = i;
186 ret = thread[i].Create (function, &param[i], CREATE_SUSPENDED);
187 Assert::IsTrue (ret, _T("Thread::Create() failed.\n"));
188 hThreads[i] = thread[i].GetHandle ();
189 }
190
191 for (int i = 0; i < size; i++)
192 {
193 int divide = i % 7;
194 switch (divide)
195 {
196 case 0:
198 break;
199 case 1:
201 break;
202 case 2:
204 break;
205 case 3:
207 break;
208 case 4:
210 break;
211 case 5:
213 break;
214 case 6:
216 break;
217 }
218 thread[i].Resume ();
219 }
220
221 WaitForMultipleObjects (size, hThreads, TRUE, INFINITE);
222
223 Logger::WriteMessage (_T ("\nThreadTest4() stopped.\n"));
224
225 for (int i = 0; i < size; i++)
226 {
227 Assert::AreEqual (loop, threadCounter[i], _T("Thread running interrupted.\n"));
228 }
229
230 delete[] thread;
231 }
232 };
233}
スレッドに関するWindowsAPIを集約したクラス
#define loop
#define size
プリコンパイル済みヘッダー ファイルです。
HANDLE APIENTRY GetHandle() const
継承先はこの関数でハンドルを取得します。
スレッドに関するWindowsAPIを集約したクラス
Definition: Thread.h:43
BOOL APIENTRY SetPriority(ThreadPriority priority) const
スレッド実行優先度を変更します。
Definition: Thread.cpp:53
BOOL APIENTRY Resume() const
スレッドを再開します。
Definition: Thread.cpp:48
BOOL APIENTRY Create(PTHREAD_START_ROUTINE function=NULL, LPVOID lpvParam=NULL, DWORD dwCreationFlag=0)
スレッドを作成します。
Definition: Thread.cpp:24
DWORD APIENTRY Wait(DWORD dwWaitTime=INFINITE) const
シグナル状態になるとブロックを解除します。
Threadクラスのスレッド実行関数を設定します。
TEST_CLASS(ArrayTest)
Definition: ArrayTest.cpp:19
@ Critical
クリティカル
@ Highest
優先度高
@ AboveNormal
通常より少し上
@ BelowNormal
通常より少し下
@ Lowest
優先度低
@ Idle
アイドル