MFC多线程文件传输的退出

paresly CSDN倒闭了没 2014-01-24 03:12:14
最近用MFC做网络文件传输的功能,用的是多线程,在文件传输过程中,可能会退出,我目前是先等待文件传完,在退出,问题是会非常的卡,如果直接退出的话,又会造成内存泄漏,详见下述:

//网络传输信息
typedef struct NetInfo
{
CString m_strSrvIP;
CString m_strFilePath;
UINT m_nPort;
Log *m_pCliLog;
int m_nState;
HWND m_hWnd;

NetInfo()
{
m_strSrvIP = _T("");
m_strFilePath = _T("");
m_nPort = -1;
m_pCliLog = NULL;
m_hWnd = NULL;
m_nPort = -1;
m_nState = 1;
}
}NetInfo;

//监听线程
DWORD WINAPI ReceThread(LPVOID lpparam)
{
NetInfo *ptNetInfo = (NetInfo*)lpparam;
//结构体中含有Cstring,会造成内存泄漏

while(TRUE)
{
if (2 == ptNetInfo->m_nState)
{
break;
}

//处理文件传输的代码
}
}

当退出是,我会在主线程中把ptNetInfo->m_nState的值改为2,然后在WaitforSingleObject()
至到退出,但是文件大的话,就非常卡,如果直接强制关闭线程,又会造成内存泄漏,求大神指点一下,要如何才能既快又无内存泄漏的关闭程序。
...全文
223 点赞 收藏 6
写回复
6 条回复
encoderlee 2014年02月07日
同意3楼,用户在传输文件过程中,点击退出程序,此时主线程把ptNetInfo->m_nState的值改为2,然后就隐藏窗口了。不用等待同步对象,当工作线程做好善后工作后,发送一个消息给主线程,主线程收到后正式结束进程。
回复 点赞
paresly 2014年02月07日
引用 3 楼 wumn29 的回复:
做成假退出, 界面隐藏, 声明一个event内核对象, 文件传输完毕置为有信号, 在退出函数里面waitforsingleobject这个event, 后面接上清理内存的代码
传输的过程不在主线程中,不会出现卡的情况,就是在退出等待是会有卡的时候。
回复 点赞
wumn29 2014年01月27日
while会卡死主线程的, 按照我在3lou说的, 搞个事件通知就行了, 主线程只需要等待
回复 点赞
wumn29 2014年01月27日
做成假退出, 界面隐藏, 声明一个event内核对象, 文件传输完毕置为有信号, 在退出函数里面waitforsingleobject这个event, 后面接上清理内存的代码
回复 点赞
lgstudyvc 2014年01月24日
退出时怎么处理的? 一个线程一个文件,退出时释放
回复 点赞
见习学术士 2014年01月24日
在循环recv 中 判断 if (2 == ptNetInfo->m_nState) 退出
回复 点赞
发动态
发帖子
进程/线程/DLL
创建于2007-09-28

6376

社区成员

4.9w+

社区内容

VC/MFC 进程/线程/DLL
社区公告
暂无公告