1.HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
SIZE_T dwStackSize, // initial stack size
LPTHREAD_START_ROUTINE lpStartAddress, // thread function
LPVOID lpParameter, // thread argument
DWORD dwCreationFlags, // creation option
LPDWORD lpThreadId // thread identifier
);
lpThreadAttributes 指向SECURITY_ATTRIBUTES结构体的指针,这里可以传递NULL。
dwStackSize 设置线程初始栈的大小,即线程可以将多少地址空间用于它自己的栈,以字节为单位。系统会把这个 参数值四舍五入为最接近的页面大小。页面是系统 管理内存时使用的内存单位,不同CPU其页面大小不同,x86使用的页面大小是48kb。当保留地址空间的一块区域时,系统要确保该区域的大小是系统页面大小的倍数。例如,希望保留10kb的地址空间区域,系统会自动对这个请求进行四舍五入,是保留的区域大小是 页面大小的倍数,在x86平台下,系统将保留一块12kb的区域,即4kb的倍数。如果这个值为0,或者小于默认的提交大小,那么默认将使用与调用该函数的线程相同的栈空间大小。
lpStartAddress 指向应用程序定义的LPTHREAD_START_ROUTINE类型的函数指针,这个函数将由新线程执行,表明新线程的起始地址。我们知道main函数是主线程的入口函数,同样地,新创建的线程也需要有一个入口函数,这个函数的地址就由此参数指定。这就要求在程序中定义一个 函数作为新线程的入口函数,该函数的名任意,但函数类型必须遵照下述声明形式 :
DWORD WINAPI ThreadProc(LPVOID lpParamter)
即新线程入口 函数有一个LPVOID类型的参数,并且返回值 是DWORD类型。
lpParamter
对main函数来说,可以接受命令行参数。同样,我们可以通过这个参数给创建的新线程传递参数 。该参数提供了一种将初始值传递给线程函数的手段。这个参数的值既可以是一个数值,也可以是一个指向其他信息的指针。
dwCreateFlags 设置用于控制线程创建的附件标记。它可以是两个值中的一个:CREATE_SUSPENDED或者0。如果该值是CREATE_SUSPENDED,那么线程创建后处于暂停状态,直到程序调用了ResumeThead函数为止;如果该值是0,那么线程在创建之后就 立即执行。
lpThreadId
这个参数是一个返回值,它指向一个变量,用来接收线程ID。当创建一个线程时,系统会为该线程分配一个ID
工作总结:
1.通过收信按钮响应函数里面,创建获取信封头的线程,当此线程执行完毕后,通过窗口的this指针向窗口发送自定义消息,this->SendMessage(WM_USER,0,0);
DWORD dwThreadID = 0;
//开启线程 ,保存信封头
HANDLE hThread = CreateThread(NULL,0,&CDuiFrameWnd::FetchEnvelopeThreadProc,(LPVOID)this,0,&dwThreadID);
CloseHandle(hThread);
2.在 WM_USER消息的响应函数里面,创建获取邮件实体的线程 ,后台进行把下载下来的数据保存到以.eml为后缀的文件里面,用MessageId进行命名。
//开启线程,下载邮件
DWORD dwThreadID = 0;
HANDLE hThread = CreateThread(NULL,0,&CDuiFrameWnd::FetchBodyThreadProc,(LPVOID)this,0,&dwThreadID);
CloseHandle(hThread);