首页 > 代码库 > 工作中线程的使用

工作中线程的使用

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);