VC多线程

一、线程的创建

CreateThread 
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, 
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
 LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
); 
lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针,这个参数通常设置为NULL 。用于内核对象跨进程。
dwStackSize:设置初始栈的大小,以字节为单位,如果为0,那么默认将使用与调用该函数的线程相同的栈空间大小。任何情况下,Windows根据需要动态延长堆栈的大小
lpStartAddress:回调函数,指向线程函数的指针,函数名称没有限制,但是必须以下列形式声明:DWORD WINAPI ThreadProc (LPVOID lpParam) ,格式不正确将无法调用成功
lpParameter: 向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL
dwCreationFlags: 线程标志,可取值如下
(1)CREATE_SUSPENDED(0x00000004):创建一个挂起的线程,没有CPU资源。
(2)0:表示创建后立即激活。
lpThreadId: lpThreadId:保存新线程的id。

注意:如果你不需要线程ID,lpThreadId参数可以被设为NULL,但这只在WindowsNT中才行得通,Windows95中就不行。如果你要写一个程序可以在Windows 95中运行,不要把lpThreadId参数设为NULL。

二、线程的中止

线程可以通过以下3种方法来终止运行 
1.线程函数返回(这是强烈推荐的)。

1)线程函数中创建的所有C++对象都通过其析构函数被正确销毁。
2)操作系统正确释放线程栈使用的内存。
3)操作系统把线程的退出代码(在线程的内核对象中维护)设为线程函数的返回值
4)系统递减少线程的内核对象的使用计数。

调用CloseHandle函数关闭句柄。
2.线程通过调用ExitThread函数“杀死”自己(要避免使用这种方法)

该函数将终止线程的运行(”杀死“主调线程),并导致操作系统清理该线程使用的所有操作系统资源。但是,你的C/C++资源(如C++类对象)不会被销毁。有鉴于些,更好的做法是直接从线程函数返回,不要自己调用ExitThread函数。


3.同一个进程或另一个进程中的线程调用TerminateThread函数(要避免使用这种方法)

不同于ExitThread总是”杀死“主调线程,TerminateThread能”杀死“任何线程。TerminateThread函数是异步的,所以函数返回时,并不保证线程已经终止了。同样,C/C++资源(如C++类对象)不会被销毁。

三、线程的挂起和恢复

ResumeThread函数
DWORD ResumeThread(
HANDLE hThread
); 


hThread :指定的要重新运行的线程的句柄
如果ResumeThread函数成功,它将返回线程的前一个挂起计数,否则,它将返回0xFFFFFFFF。一个线程可以被多次挂起。如果一个线程被挂起三次,那么必需调用ResumeThread三次,才能使起线程运行。


SuspendThread函数
DWORD SuspendThread(
HANDLE hThread
); 
hThread :指定的要挂起的线程的句柄
如果SuspendThread函数成功,它将返回线程的前一个挂起计数,否则,它将返回0xFFFFFFFF.在实际开发中, 应用程序在调用SuspendThread时必需小心,因为试图挂起一个线程时,我们不知道线程在做什么,比如说如果线程正在分配堆中的内存,线程将锁定堆,当其他线程要访问堆的时候,它们的执行将被中止,直到第一个线程恢复。
注意:线程的挂起和恢复是配对使用的。

四、线程的睡眠

Sleep函数使得线程在一段时间内自己不需要调度 
void Sleep(
DWORD dwMilliseconds
); 
dwMilliseconds:毫秒时间





你可能感兴趣的:(VC多线程)