任何函数都可以新建自己的子线程,互相之间没有影响。
新建线程是一个临时变量,所以句柄命名可以一样。
//新建一个线程
HANDLE hThread1 = CreateThread(NULL,0,SendProc,(LPVOID)this,0,NULL);
CloseHandle(hThread1);
第三个参数是线程函数的名字。
第四个参数:向线程函数传递的参数,是一个可以指向任意类型的指针,不需传递参数时,为NULL。对于基于对话框的编程,一般会传递一个this指针,方便子线程可以操作对话框的成员变量或者控件。当需要传递的参数比较多时,比如网络编程时需要向子线程传入套接字,可以传递一个结构体指针,把所有需要传递的参数都放进结构体中,机构体中可以有指针,也可以有值。
//结构体声明放在头文件中
struct RECVPARAM
{
SOCKET sock;
CDlg *pDlg;
};
//结构体定义放在源文件中
RECVPARAM *pRecvParam=new RECVPARAM;
pRecvParam->pDlg= this;
pRecvParam->sock = m_socket;
//新建一个线程
HANDLE hThread1 = CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);
CloseHandle(hThread1);
其他几个参数不需要改动。
线程入口函数只能是全局函数,或者类的静态函数。
//源文件中:全局函数
DWORD WINAPI RecvProc(LPVOID lpParameter)
{
}
//头文件中:静态成员函数
static DWORD WINAPI RecvProc(LPVOID lpParameter);
//源文件中:静态成员函数
DWORD WINAPI CLED显示屏升级Dlg::RecvProc(LPVOID lpParameter)
{
}
线程函数的第一步要接收参数
//接收参数:单独的this指针
CLED显示屏升级Dlg *pDlg = (CLED显示屏升级Dlg *)lpParameter;
//接收参数:结构体指针
CDlg *pDlg = ((RECVPARAM_COM *)lpParameter)->pDlg;
SOCKET sock = ((RECVPARAM_COM *)lpParameter)->sock;
最后一步要有返回值
//返回
return 0;
在线程函数里,只要用到对话框的成员,前边必须加上指针pDlg->。