首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

多线程一

2012-12-21 
多线程1////////////////The CreateThread function creates a new thread for a process. The creating t

多线程1
////////////////










    The CreateThread function creates a new thread for a process. The creating thread must specify the starting address of the code that the new thread is to execute. Typically, the starting address is the name of a function defined in the program code (for more information, see ThreadProc). This function takes a single parameter and returns a DWORD value. A process can have multiple threads simultaneously executing the same function.             /*     The following is a simple example that demonstrates how to create a new thread that executes the locally defined function, ThreadProc. The creating thread uses a dynamically allocated buffer to pass unique information to each instance of the thread function. It is the responsibility of the thread function to free the memory.          The calling thread uses the WaitForMultipleObjects function to persist until all worker threads have terminated. Note that if you were to close the handle to a worker thread before it terminated, this does not terminate the worker thread. However, the handle will be unavailable for use in subsequent function calls.*/                #include <windows.h>      #include <strsafe.h>           #define MAX_THREADS 3      #define BUF_SIZE 255            typedef struct _MyData {          int val1;          int val2;      } MYDATA, *PMYDATA;            DWORD WINAPI ThreadProc( LPVOID lpParam )       {           HANDLE hStdout;          PMYDATA pData;                TCHAR msgBuf[BUF_SIZE];          size_t cchStringSize;          DWORD dwChars;                hStdout = GetStdHandle(STD_OUTPUT_HANDLE);          if( hStdout == INVALID_HANDLE_VALUE )              return 1;                // Cast the parameter to the correct data type.                pData = (PMYDATA)lpParam;                // Print the parameter values using thread-safe functions.                StringCchPrintf(msgBuf, BUF_SIZE, TEXT("Parameters = %d, %d\n"),               pData->val1, pData->val2);           StringCchLength(msgBuf, BUF_SIZE, &cchStringSize);          WriteConsole(hStdout, msgBuf, cchStringSize, &dwChars, NULL);                // Free the memory allocated by the caller for the thread           // data structure.                HeapFree(GetProcessHeap(), 0, pData);                return 0;       }              void main()      {          PMYDATA pData;          DWORD dwThreadId[MAX_THREADS];          HANDLE hThread[MAX_THREADS];           int i;                // Create MAX_THREADS worker threads.                for( i=0; i<MAX_THREADS; i++ )          {              // Allocate memory for thread data.                    pData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,                      sizeof(MYDATA));                    if( pData == NULL )                  ExitProcess(2);                    // Generate unique data for each thread.                    pData->val1 = i;              pData->val2 = i+100;                    hThread[i] = CreateThread(                   NULL,              // default security attributes                  0,                 // use default stack size                    ThreadProc,        // thread function                   pData,             // argument to thread function                   0,                 // use default creation flags                   &dwThreadId[i]);   // returns the thread identifier                      // Check the return value for success.                      if (hThread[i] == NULL)               {                  ExitProcess(i);              }          }                // Wait until all threads have terminated.                WaitForMultipleObjects(MAX_THREADS, hThread, TRUE, INFINITE);                // Close all thread handles upon completion.                for(i=0; i<MAX_THREADS; i++)          {              CloseHandle(hThread[i]);          }      }  

热点排行