#include <windows.h>
#include <strsafe.h>//win2003SDK必須安裝 要不無此頭文件。此文件是為了實現(xiàn)StringCchPrintf,StringCchLength。
#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_tcchStringSize;
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=(PMYDATA)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 there turn value for success.
if(hThread[i]==NULL)
{
ExitProcess(i);
}
}
//Wait until all threads have terminated.
WaitForMultipleObjects(MAX_THREADS,hThread,TRUE,INFINITE);
//Close all thread handle supon completion.
for(i=0;i<MAX_THREADS;i++)
{
CloseHandle(hThread[i]);
}
}