急问,这段多线程下载代码有什么问题
时间:2011-12-06
来源:互联网
下面是我写的下载HTTP文件的代码,我自己测试时没啥问题,但在客户那里会出现,如果下载地址错误的时候,有时候会出现等待窗口不关闭的情况,根据log日志显示,显示了下载失败,应该线程结束了,但等待窗口没关闭
请问在线程里通过句柄发送WM_CLOSE消息会有问题吗,还是要自定义一个消息,然后在这个消息处理函数里关闭等待窗口
因为这个问题随机出现不好调试,请大家帮帮忙,急用,谢谢
下面是线程函数
C/C++ code
以下是调用线程的代码
C/C++ code
请问在线程里通过句柄发送WM_CLOSE消息会有问题吗,还是要自定义一个消息,然后在这个消息处理函数里关闭等待窗口
因为这个问题随机出现不好调试,请大家帮帮忙,急用,谢谢
下面是线程函数
C/C++ code
UINT CAutoBurnDlg::ThreadHttpDownload(LPVOID lpParam) { _Down_Param* pDp = (_Down_Param*)lpParam; CString szHttpLink = pDp->strLink; //下载地址 CString szLocalFile= pDp->strLocal; //本机保存的路径 HINTERNET hSession = InternetOpen("RookIE/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); pDp->bRet = TRUE; if (hSession) { HINTERNET hUrlSession = InternetOpenUrl(hSession,szHttpLink,NULL, 0, INTERNET_FLAG_DONT_CACHE, 0); if (hUrlSession) { DWORD dwStatus = 0; DWORD dwSizeOfRq = 4; DWORD dwBytes = 0; BOOL bResult = HttpQueryInfo(hUrlSession,HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, (LPVOID)&dwStatus, &dwSizeOfRq, &dwBytes); if (bResult && dwStatus >= 200 && dwStatus < 300) { CFile file; if(file.Open(szLocalFile,CFile::modeCreate|CFile::modeReadWrite)) { TCHAR szTemp[MAX_BUFFER]={0}; DWORD dwNum =1; while (dwNum > 0) { InternetReadFile(hUrlSession, szTemp, MAX_BUFFER-1, &dwNum); file.Write(szTemp,dwNum); } file.Close(); } else pDp->bRet = FALSE; } else { CString strT; strT.Format("HTTP下载错误代码:%d",dwStatus); // m_Log.WriteLog(strT); pDp->bRet = FALSE; } InternetCloseHandle(hUrlSession); hUrlSession = NULL; } else pDp->bRet = FALSE; InternetCloseHandle(hSession); hSession = NULL; } else { pDp->bRet = FALSE; } //pDp->pDlgWait是等待窗口的句柄,这样调用有问题吗,还是其他地方有问题,为什么有时候无法关闭窗口呢 ((CDlgWaiting*)pDp->pDlgWait)->SendMessage(WM_CLOSE, 0, 0); return 0; }
以下是调用线程的代码
C/C++ code
CWinThread *pThreadHttpDownload = AfxBeginThread(ThreadHttpDownload,(LPVOID*)dp,NULL); m_pDlgWaiting->m_strInfo.Format("正在下载文件,请等待!"); m_pDlgWaiting->DoModal(); WaitForSingleObject(pThreadHttpDownload->m_hThread,INFINITE);
作者: msn123321 发布时间: 2011-12-06
((CDlgWaiting*)pDp->pDlgWait)->SendMessage(WM_CLOSE, 0, 0);
不要用Send, 用Post.
或者你直接在你的dialog里面设置一个timer来检测线程是否跑完, 跑完就自己close吧. 反正你也是doModal的形式的.
不要用Send, 用Post.
或者你直接在你的dialog里面设置一个timer来检测线程是否跑完, 跑完就自己close吧. 反正你也是doModal的形式的.
作者: dfasri 发布时间: 2011-12-06
自己重载OnClose函数,然后添加Log,看是否调用,就知道是否WM_CLOSE发送成功了
作者: oyljerry 发布时间: 2011-12-06
URLDownLoadToFile()一个函数就可以
作者: VisualEleven 发布时间: 2011-12-06
谢谢楼上各位,我先试试,大家能不能指出我代码不合理的地方,让我知所以然
作者: msn123321 发布时间: 2011-12-06
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28