目录
1、类的成员变量
同一个类中的多个函数中都要使用的变量应设置为类的成员变量
2、魔鬼数字
解决方法:定义成宏
目的:1、好理解 2、好修改,如果需要修改,只需要修改一处
3、创建接收数据的线程
(1)CreateThread 和 ExistThread
如果线程中使用了C++运行时库的函数(比如strcpy),这些函数会申请空间,但是不释放
ExistThread退出线程时也不释放这些空间,会造成内存泄漏
(2)_beginthreadex和_endthreadex
_endthreadex会在线程退出的时候,先回收空间,再调用EXistThread
m_handle=(HANDLE)_beginthreadex(nullptr,0,&recvThread,this,0,nullptr);
第一个参数_Security:表示安全级别,nullptr为使用默认安全级别
第二个参数_StackSize:表示堆栈大小,0表示使用默认堆栈大小1M
堆栈大小决定了一个服务端能创建多少线程
第三个参数_StartAddress:表示线程函数起始地址,&recvThread
第四个参数_ArgList:表示线程函数参数列表,this
第五个参数_InitFlag:表示初始化标志位,0表示线程创建即运行,还有一个挂起状态
第六个参数_ThrdAddr:表示操作系统给线程分配的id,输出参数,nullptr表示不需要
HANDLE为重定义的类型,原类型为void*,初始化时可初始化为nullptr
4、线程函数
线程的作用取决于线程函数的写法
unsigned __stdcall Udp::recvThread(void* IpVoid)
{
Udp* pThis = (Ud