- MFC中不可以在Dialog代码中使用死循环
在MFC Dialog中使用死循环会导致界面假死,MFC Diaglog界面的显示本来就是依靠一个线程来完成的,到使用死循环时这个线程就会一直卡在这,导致界面无法刷新,造成界面的假死。
解决方法:新开一个线程,在线程中处理死循环的问题。
新开线程的基本格式:
(1)声明线程函数:DWORD WINAPI recvFun(LPVOID lpParam);
需要注意的时不能把函数声明成为一个类的函数,这样在创建线程时会导致函数类型不符合线程创建的参数类型的要求。
其中lpParam是一个无类型的指针,无需转化就可已直接传入,但在函数内部使用时要进行类型的强制转化,将LPVOID转化为对应的结构体类型。
(2)线程的创建:
HANDLE hThread;
注:HANDLE是句柄,参考链接:句柄的介绍
DWORD ThreadID;
注:DWORD是MFC中一种无符号整型
hThread = CreateThread(NULL, 0, recvFun,&lpParam, 0, &ThreadID);
其中recvFun是要线程执行的函数. - 有关C++中内存释放的问题
(1)在函数中声明的内存在函数执行完之后就会被销毁,如果在函数中用malloc()声明了一段存储空间,返回指针,在函数体外也无对这段存储空间进行操作。
(2)用 类名+对象名申请的对象会在这个对象的生命周期结束时被析构函数析构。
生命周期结束的两种情况:
<1>对象在函数体类声明:此时当这个函数执行完之后这个对象就会被析构。
<2>对象时类的成员变量:此时该对象会在其所在对象被析构之后再被析构。
(3)用new创建对象后,对象不会因为脱离作用域而被析构也不会因为所在对象被析构而被析构,只有在调用delete显示析构之后才会析构
(4)当在一个类的一个方法中创建一个线程时,如果向这个线程函数内传的有对象,则这个对象不论时类的成员还是方法体内的变量都应用new创建,因为这个线程已经脱离对象了,在该对象被析构时,这个对象内的创建的线程有可能还为消亡。
参考链接:
用MFC进行TCP文件传输遇到的问题
最新推荐文章于 2023-05-07 12:00:47 发布