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