多线程编程(一)――CreateThread
2010年07月27日
操作系统提供的SDK API CreateThread原型如下: lpThreadAttributes: 指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,设为NULL,表示使用缺省值。 dwStackSize: 线程堆栈大小,一般为0,在任何情况下,Windows根据需要动态延长堆栈的大小。可以使用链接器的/STACK: [reserve ] [,commit] 来控制。 reserve设置系统为线程栈预留多少地址空间,默认为1M;commit表示最初为栈预料的地址空间调拨多少物理内存空间,默认是1个页面。
lpStartAddress: 指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:
DWORD WINAPI ThreadProc (LPVOID pParam) ,格式不正确将无法调用成功。
lpParameter :向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。
dwCreationFlags :如果设置为CREATE_SUSPENDED,线程创建后被挂起,只有当你调用ResumeThread 的时候它才继续进行。
如果设置为0的话,在线程创建后立即执行。 如果设置为STACK_SIZE_PARAM_IS_A_RESERVATION ,则使用dwStackSize 标记中的reserve,否则的话是commit。 在Windows 2000/NT and Windows Me/98/95下 STACK_SIZE_PARAM_IS_A_RESERVATION 无效.
lpThreadId :保存新线程的id。
函数返回值: 若函数成功,返回线程句柄;函数失败返回FALSE。
下面举例说明:
SDKThreading.h #ifndef MULTITHREAD #define MULTITHREAD class DrawPicture { public: static DWORD WINAPI MyThreadFunc(LPVOID lpParam ); void Draw(); private: static int nPoint; }; #endif SDKThreading.cpp #include #include #include "SDKThreading.h" using namespace std; int DrawPicture::nPoint = 20; DWORD WINAPI DrawPicture::MyThreadFunc( LPVOID lpParam ) { while(nPoint > 0) { coutDraw(); delete pDraw; system("pause"); return 0; } 对于线程的终止,大体有如下4种:
1.线程函数的返回,这种方式强烈建议使用。
2.线程自己调用ExitThread函数自杀(
2010年07月27日
操作系统提供的SDK API CreateThread原型如下: lpThreadAttributes: 指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,设为NULL,表示使用缺省值。 dwStackSize: 线程堆栈大小,一般为0,在任何情况下,Windows根据需要动态延长堆栈的大小。可以使用链接器的/STACK: [reserve ] [,commit] 来控制。 reserve设置系统为线程栈预留多少地址空间,默认为1M;commit表示最初为栈预料的地址空间调拨多少物理内存空间,默认是1个页面。
lpStartAddress: 指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:
DWORD WINAPI ThreadProc (LPVOID pParam) ,格式不正确将无法调用成功。
lpParameter :向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。
dwCreationFlags :如果设置为CREATE_SUSPENDED,线程创建后被挂起,只有当你调用ResumeThread 的时候它才继续进行。
如果设置为0的话,在线程创建后立即执行。 如果设置为STACK_SIZE_PARAM_IS_A_RESERVATION ,则使用dwStackSize 标记中的reserve,否则的话是commit。 在Windows 2000/NT and Windows Me/98/95下 STACK_SIZE_PARAM_IS_A_RESERVATION 无效.
lpThreadId :保存新线程的id。
函数返回值: 若函数成功,返回线程句柄;函数失败返回FALSE。
下面举例说明:
SDKThreading.h #ifndef MULTITHREAD #define MULTITHREAD class DrawPicture { public: static DWORD WINAPI MyThreadFunc(LPVOID lpParam ); void Draw(); private: static int nPoint; }; #endif SDKThreading.cpp #include #include #include "SDKThreading.h" using namespace std; int DrawPicture::nPoint = 20; DWORD WINAPI DrawPicture::MyThreadFunc( LPVOID lpParam ) { while(nPoint > 0) { coutDraw(); delete pDraw; system("pause"); return 0; } 对于线程的终止,大体有如下4种:
1.线程函数的返回,这种方式强烈建议使用。
2.线程自己调用ExitThread函数自杀(