The windows api of thread (CreateThread)

1  win32 api  (CreateThread)

MSDN中创建线程的方法CreateThread原型:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
)

参数说明
    lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。
在Windows 98中忽略该参数。在Windows NT中,NULL使用默认安全性,不可以被子
线程继承,否则需要定义一个结构体将它的bInheritHandle成员初始化为TRUE
    dwStackSize,设置初始栈的大小,以字节为单位。
如果为0,那么默认将使用与调用该函数的线程相同的栈空间大小。
任何情况下,Windows根据需要动态延长堆栈的大小。
    lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,
但是必须以下列形式声明:DWORD WINAPI 函数名 (LPVOID lpParam) ,
格式不正确将无法调用成功。
也可以直接调用void类型
  void threadfunc()
    lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。
    dwCreationFlags :线程标志,可取值如下
      (1) CREATE_SUSPENDED(0x00000004):创建一个挂起的线程,
      (2) 0:表示创建后立即激活。
      (3) STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000):
dwStackSize参数指定初始的保留堆栈的大小,
否则,dwStackSize指定提交的大小。
该标记值在Windows 2000/NT and Windows Me/98/95上不支持。
    lpThreadId:保存新线程的id。
若不想返回线程ID,设置值为NULL。
注意:
    一般并不推荐使用 CreateThread函数,而推荐使用RTL库里的System单元中定义的 BeginThread函数,
因为这除了能创建一个线程和一个入口函数以外,还增加了几项保护措施。
    在MFC程序中,应该调用AfxBeginThread函数,在Visual C++程序中应调用_beginthreadex函数。

例子:
#include<windows.h>
#include<strsafe.h>//win2003SDK必须安装 要不无此头文件。此文件是为了实现StringCchPrintf,StringCchLength。
#define MAX_THREADS3
#define BUF_SIZE255
typedef struct _Data{
int val1;
int val2;
}DATA,*PDATA;
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
HANDLE hStdout;
PDATA 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=(PDATA)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()
{
PDATA pData;
DWORD dwThreadId[MAX_THREADS];
HANDLE hThread[MAX_THREADS];
int i;
//Create MAX_THREADS workerthreads.
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 stacksize
ThreadProc,//thread function
pData,//argument to thread function
0,//use default creation flags
&dwThreadId[i]);//returns the threadid entifier
//Check the return value for success.
if(hThread[i]==NULL)
{
ExitProcess(i);
}
}
//Wait until all thread shave terminated.
WaitForMultipleObjects(MAX_THREADS, hThread, TRUE, INFINITE);
//Close all thread handle supon completion.
for(i=0; i<MAX_THREADS; i++)
{
CloseHandle(hThread[i]);
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值