#include <iostream>
#include "windows.h"
#include "process.h"
//#define TEST_CRT
#define TEST_WINAPI
#ifdef TEST_CRT
#define TEST_FUNC_CREATE(c) (HANDLE)_beginthreadex (NULL, 0, (c), 0, CREATE_SUSPENDED, NULL)
#define TEST_FUNC_DELETE(h) ({ if ((h)) { WaitForSingleObject ((h), INFINITE); CloseHandle ((h)); }})
#define TEST_FUNC_RESUME(h) ({ if ((h)) ResumeThread ((h)); })
#define TEST_RETURN unsigned int __stdcall
#endif
#ifdef TEST_WINAPI
#define TEST_FUNC_CREATE(c) CreateThread (NULL, 0, (c), 0, CREATE_SUSPENDED, NULL)
#define TEST_FUNC_DELETE(h) ({ if ((h)) { WaitForSingleObject ((h), INFINITE); CloseHandle ((h)); }})
#define TEST_FUNC_RESUME(h) ({ if ((h)) ResumeThread ((h)); })
#define TEST_RETURN DWORD WINAPI
#endif
struct Ex
{
};
TEST_RETURN MyCallback (void*)
{
try
{
throw Ex ();
}
catch (Ex&)
{
}
return 0;
}
const int count = 100;
const int loop = 10;
int main()
{
HANDLE threads[count];
int i;
int j;
for (i = 0; i++ < loop; )
{
std::cout << "Iteration #" << i << std::endl;
std::cout << " Create threads..." << std::endl;
for (j = 0; j++ < count; )
threads[j] = TEST_FUNC_CREATE (&MyCallback);
Sleep (500);
std::cout << " Resume theads..." << std::endl;
for (j = 0; j++ < count; )
TEST_FUNC_RESUME (threads[j]);
Sleep (500);
std::cout << " Delete threads..." << std::endl;
for (j = 0; j++ < count; )
TEST_FUNC_DELETE (threads[j]);
Sleep (500);
std::cout << " Done." << std::endl;
}
return 0;
}