CreateThread AfxBeginThread 使用小结
这次在公司接触了一个模块,用于接收警报器传回的警报消息,我这边主要完成消息的接收解析与XmlRpc的excute。
在接收消息的时候在主线程中加一个线程用于启动第一次是CreateThread的基本为在主线程中调用Add_IO_Watch函数然后再Add_IO_Watch的函数体中调用CreateThread,
在调用CreateThread的时候传递的参数为CreateThread(NULL,0,CUniSightDlg::IOWatch,(LPVOID)this,0,&threadid)
原型为HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, NULL使用默认安全性
DWORD dwStackSize, 设置初始栈的大小,以字节为单位,如果为0,那么默认将使用与调用该函数的线程相同的栈空间大小。任何情况下,Windows根据需要动态延长堆栈的大小。
LPTHREAD_START_ROUTINE lpStartAddress,指向线程函数的指针,该函数必须为DWORD WINAPI 函数名(LPVOID lpParam)型且在头文件中必须声明为static
LPVOID lpParameter,传递给子线程的参数,是一个指向结构的指针,不需传递参数时,为NULL。(LPVOID)this传的是当前窗口对象
DWORD dwCreationFlags,线程标志,可取值如下CREATE_SUSPENDED(0x00000004):创建一个挂起的线程。0:表示创建后立即激活。
LPDWORD lpThreadId);保存新线程的id
因为子线程的函数为static所以导致无法使用this指针使用主线程的变量,所以在传递参数的时候将主线程的this或者需要传递的参数的结构体传递过去并解析出然后再该函数体中调用真正执行功能的函数即可。
用完发现网上传说的内存泄露问题虽然在我的程序中没有出现(因为当线程的函数用到了C的标准库的时候,很容易导致冲突,导致遗留的全局变量等问题)
在下一次使用多线程的时候便使用了MFC下封装的AfxBeginThread他们的参数大体相同
(select,//线程函数必须为static以及返回值为UINT,传参用同样的方式
(LPVOID)this,//参数
THREAD_PRIORITY_NORMAL,//线程的优先级,一般设置为 0 .让它和主线程具有共同的优先级
0,指定新创建的线程的栈的大小.如果为 0,新创建的线程具有和主线程一样的大小的栈
0, 指定创建线程以后,线程有怎么样的标志.可以指定两个值CREATE_SUSPENDED : 线程创建以后,会处于挂起状态,直到调用:ResumeThread 0 : 创建线程后就开始运行.
NULL);指向一个 SECURITY_ATTRIBUTES 的结构体,用它来标志新创建线程的安全性.如果为 NULL ,那么新创建的线程就具有和主线程一样的安全性.
::GetExitCodeThread函数结束进程。

浙公网安备 33010602011771号