The windows api of thread (CreateThread)

windows 专栏收录该内容
1 篇文章 0 订阅

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
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值