+ -
当前位置:首页 → 问答吧 → 急问,这段多线程下载代码有什么问题

急问,这段多线程下载代码有什么问题

时间:2011-12-06

来源:互联网

下面是我写的下载HTTP文件的代码,我自己测试时没啥问题,但在客户那里会出现,如果下载地址错误的时候,有时候会出现等待窗口不关闭的情况,根据log日志显示,显示了下载失败,应该线程结束了,但等待窗口没关闭
请问在线程里通过句柄发送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的形式的.

作者: dfasri   发布时间: 2011-12-06

自己重载OnClose函数,然后添加Log,看是否调用,就知道是否WM_CLOSE发送成功了

作者: oyljerry   发布时间: 2011-12-06

URLDownLoadToFile()一个函数就可以

作者: VisualEleven   发布时间: 2011-12-06

谢谢楼上各位,我先试试,大家能不能指出我代码不合理的地方,让我知所以然

作者: msn123321   发布时间: 2011-12-06