HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
参数
lpThreadAttributes 描述施行于这一新线程的security属性。NULL表
示使用缺省值。此参数在Windows 95中被忽略。
本书并不论及security。
dwStackSize 新线程拥有自己的堆栈。0 表示使用缺省大小:
1MB。
lpStartAddress 新线程将开始的起始地址。这是一个函数指针。(译
注:在C语言中函数名称即代表函数指针,所以这
里可放一个函数名称)
lpParameter 此值将被传送到上述所指定之新线程函数去,作为
参数。
dwCreationFlags 允许你产生一个暂时挂起的线程。默认情况是“立
即开始执行”。
lpThreadId 新线程的ID会被传回到这里。
返回值
如果CreateThread( )成功,传回一个handle ,代表新线程。否则传回一个
FALSE。如果失败,你可以调用GetLastError( )获知原因。
下面是各种 Win32 核心对象的清单。本书涵盖 pipes 之外的每一种核心对
象。
进程(processes)
线程(threads)
文件(files)
事件(events)
信号量(semaphores)
CloseHandle的重要性
当你完成你的工作后,应该调用CloseHandle 释放核心对象。
BOOL CloseHandle (
HANDLE hObject
);
参数
hObject 代表一个已打开之对象handle
返回值
如果成功,CloseHandle( )传回TRUE。如果失败则传回FALSE,此时你可
以调用GetLastError( )获知失败原因。
线程结束代码可以藉着调用GetExitCodeThread( )(并给予CreateThread
所获得的线程ID作为参数)而得知:
BOOL GetExitCodeThread(
HANDLE hThread,
LPDWORD lpExitCode
);
参数
hThread 由CreateThread( )传回的线程handle
lpExitCode 指向一个DWORD,用以接受结束代码(exit code)
返回值
如果成功,GetExitCodeThread( )传回TRUE,否则传回FALSE。如果失败,
你可以调用GetLastError( )找出原因。如果线程已结束,那么线程的结束代
码会被放在lpExitCode参数中带回来。如果线程尚未结束,lpExitCode带回
来的值是STILL_ACTIVE。
VOID ExitThread(
DWORD dwExitCode
);
参数
dwExitCode 指定此线程之结束代码
返回值
没有。此函数从不返回。
这个函数有点像C runtime library中的exit( )函数,因为它可以在任
何时候被调用并且绝不会返回。任何代码若放在此行之下,保证不会被执行。
互斥器(mutexes)
管道(Pipes。分为named和anonymous两种)
// win32Thread.cpp : 定义控制台应用程序的入口点。 // #include <stdio.h> #include <Windows.h> #include <tchar.h> DWORD WINAPI ThreadProc(void* pmsg) { DWORD n = (DWORD)pmsg; Sleep(n*5000); return n * 10; } DWORD WINAPI ThreadProc1(void* pmsg) { ExitThread(100); return 0; } int _tmain(int argc, _TCHAR* argv[]) { HANDLE hThread1, hThread2; DWORD dThreadID1,DThreadId2; DWORD dExitCode1,dExitCode2; hThread1 = CreateThread(NULL,0,ThreadProc,LPVOID(1), 0, &dThreadID1); hThread2 = CreateThread(NULL,0,ThreadProc1,LPVOID(2), 0, &DThreadId2); while(1) { printf("please Enter:"); getchar(); GetExitCodeThread(hThread1, &dExitCode1); GetExitCodeThread(hThread2, &dExitCode2); if (dExitCode1 == STILL_ACTIVE) { printf("Thread 1 running\n"); } if (dExitCode2 == STILL_ACTIVE) { printf("Thread2 running\n"); } if (dExitCode1 !=STILL_ACTIVE && dExitCode2 != STILL_ACTIVE) { printf("Thread Two End\n"); break; } } CloseHandle(hThread1); CloseHandle(hThread2); printf("%d,%d\n",dExitCode1, dExitCode2); system("pause"); return 0; }
使用了以上的win32线程函数