File: thread.cpp - Tab length: 1 2 4 8 - Lines: on off - No wrap: on off


#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;
}