新建线程

任何函数都可以新建自己的子线程,互相之间没有影响。
新建线程是一个临时变量,所以句柄命名可以一样。

 //新建一个线程
    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->。

你可能感兴趣的:(其他)