创建主题

【勇芳软件工作室】汉化HomePreviousNext

CreateThread函数为进程创建一个新的线程。创建线程必须指定新线程要执行的代码的起始地址。通常,起始地址是程序代码中定义的函数的名称。此函数使用单个参数并返回DWORD值。进程可以有多个线程同时执行相同的功能。

以下示例演示如何创建一个执行本地定义的函数ThreadFunc的新线程。

DWORD WINAPI ThreadFunc(LPVOID lpParam)

{

char szMsg[80];

wsprintf( szMsg, "ThreadFunc: Parameter = %d\n", *lpParam );

MessageBox( NULL, szMsg, "Thread created.", MB_OK );

return 0;

}

VOID主(VOID)

{

DWORD dwThreadId, dwThrdParam = 1;

HANDLE hThread;

hThread = CreateThread(

NULL, //没有安全属性

0, //使用默认堆栈大小

ThreadFunc, //线程函数

&dwThrdParam, //参数线程函数

0, //使用默认创建标志

&dwThreadId); //返回线程标识符

//检查返回值是否成功。

if (hThread == NULL)

ErrorExit( "CreateThread failed." );

CloseHandle( hThread );

}

为了简单起见,此示例将指向DWORD值的指针作为线程函数的参数传递。这可以是指向任何类型的数据或结构的指针,或者可以通过传递NULL指针并删除对ThreadFunc中的参数的引用来完全省略。

如果创建线程在新线程之前退出,因为指针变为无效,那么传递局部变量的地址是有风险的。相反,要么将指针传递给动态分配的内存,要么使创建线程等待新线程终止。数据也可以使用全局变量从创建线程传递到新线程。使用全局变量,通常需要通过多个线程同步访问。有关同步的更多信息,请参阅同步执行多个线程.

在线程可能创建多个线程来执行相同代码的进程中,使用全局变量是不方便的。例如,允许用户同时打开多个文件的过程可以为每个文件创建一个新的线程,每个线程都执行相同的线程函数。创建线程可以传递线程函数的每个实例所需的唯一信息(如文件名)作为参数。您不能为此目的使用单个全局变量,但您可以使用动态分配的字符串缓冲区。

创建线程可以使用CreateThread的参数来指定以下内容:

*新线程的句柄的安全属性。这些安全属性包括继承标志,用于确定句柄是否可由子进程继承。安全属性还包括安全描述符,系统在授予访问权限之前用于执行对线程句柄的所有后续使用的访问检查。

*新线程的初始堆栈大小。线程的堆栈会自动分配到进程的内存空间中;系统根据需要增加堆栈,并在线程终止时释放它。

*创建标志,使您能够在挂起状态下创建线程。挂起后,直到ResumeThread函数被调用为止,线程才会运行。

Windows NT:您也可以通过调用CreateRemoteThread函数创建一个线程。调试器进程使用此函数来创建在被调试进程的地址空间中运行的线程。