9using namespace Microsoft::VisualStudio::CppUnitTestFramework;
16 TEST_CLASS_INITIALIZE (ClassInitialize)
18 Logger::WriteMessage (
"ThreadTest class initialize.\n");
21 TEST_CLASS_CLEANUP (ClassCleanup)
23 Logger::WriteMessage (
"ThreadTest class cleanup.\n");
26 TEST_METHOD_INITIALIZE (MethodInitialize)
28 Logger::WriteMessage (
"ThreadTest method initialize.\n");
31 TEST_METHOD_CLEANUP (MethodCleanup)
33 Logger::WriteMessage (
"ThreadTest method cleanup.\n");
39 DWORD Invoke (LPVOID lpvParam)
41 for (
int i = 0; i < 10; i++)
43 Logger::WriteMessage (_T (
"Invoke() working...\n"));
47 Logger::WriteMessage (_T (
"Invoke() stopped.\n"));
55 MyThread () { _callback =
this; };
58 DWORD Invoke (LPVOID lpvParam)
60 for (
int i = 0; i < 10; i++)
62 Logger::WriteMessage (_T (
"Invoke() working...\n"));
66 Logger::WriteMessage (_T (
"Invoke() stopped.\n"));
71 TEST_METHOD (ThreadTest1)
73 static int threadCounter = 0;
75 Callback* pCallback =
new Callback ();
77 BOOL ret1 = pThread->
Create ();
78 Assert::IsTrue (ret1, _T(
"Thread::Create() failed.\n"));
80 for (
int i = 0; i < 10; i++)
83 Logger::WriteMessage (_T (
"ThreadTest1() working...\n"));
87 Logger::WriteMessage (_T (
"ThreadTest1() stopped.\n"));
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"));
97 TEST_METHOD (ThreadTest2)
99 static int threadCounter = 0;
101 auto pWorker =
new MyThread ();
102 BOOL ret1 = pWorker->Create ();
103 Assert::IsTrue (ret1, _T(
"Thread::Create() failed.\n"));
105 for (
int i = 0; i < 10; i++)
108 Logger::WriteMessage (_T (
"."));
112 Logger::WriteMessage (_T (
"ThreadTest2() stopped.\n"));
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"));
121 TEST_METHOD (ThreadTest3)
124 static int threadCounter = 0;
125 auto function = [](LPVOID lpvParam)->DWORD
127 int* waitTime = (
int*)lpvParam;
129 for (
int i = 0; i < 10; i++)
132 Logger::WriteMessage (_T (
"."));
136 Logger::WriteMessage (_T (
"ThreadTest3() stopped.\n"));
141 LONGLONG waitTime = 30;
142 thread->
Create (function, &waitTime);
145 Assert::AreEqual (10, threadCounter, _T(
"Thread::Wait() invalid timing.\n"));
152 TEST_METHOD (ThreadTest4)
154 static int threadCounter[
size];
155 for (
int i = 0; i <
size; i++)
157 threadCounter[i] = 0;
160 auto function = [](LPVOID lpvParam)->DWORD
162 int* index = (
int*)lpvParam;
165 for (
int i = 0; i <
loop; i++)
167 threadCounter[*index]++;
168 wsprintf (tszMsg, _T (
"thread(%02d) count(%02d)\n"), *index, i);
169 Logger::WriteMessage (tszMsg);
173 Logger::WriteMessage (_T (
"ThreadTest4() stopped.\n"));
179 HANDLE hThreads[
size];
183 for (
int i = 0; i <
size; i++)
186 ret = thread[i].
Create (function, ¶m[i], CREATE_SUSPENDED);
187 Assert::IsTrue (ret, _T(
"Thread::Create() failed.\n"));
191 for (
int i = 0; i <
size; i++)
221 WaitForMultipleObjects (
size, hThreads, TRUE, INFINITE);
223 Logger::WriteMessage (_T (
"\nThreadTest4() stopped.\n"));
225 for (
int i = 0; i <
size; i++)
227 Assert::AreEqual (
loop, threadCounter[i], _T(
"Thread running interrupted.\n"));
スレッドに関するWindowsAPIを集約したクラス
HANDLE APIENTRY GetHandle() const
継承先はこの関数でハンドルを取得します。
スレッドに関するWindowsAPIを集約したクラス
BOOL APIENTRY SetPriority(ThreadPriority priority) const
スレッド実行優先度を変更します。
BOOL APIENTRY Resume() const
スレッドを再開します。
BOOL APIENTRY Create(PTHREAD_START_ROUTINE function=NULL, LPVOID lpvParam=NULL, DWORD dwCreationFlag=0)
スレッドを作成します。
DWORD APIENTRY Wait(DWORD dwWaitTime=INFINITE) const
シグナル状態になるとブロックを解除します。
Threadクラスのスレッド実行関数を設定します。